awk,grep,sed命令详解,相关实例

awk

awk可以理解为文本处理工具,我们现在使用的awk其实是gaswk

sed,awk,grep linux三剑客
sed主要是编辑文本
grep 查找
awk格式化文本内容

awk基本语法

awk [options] Pattern{Action} file
awk没有指定分隔符的情况下,以空格作为分隔符,以换行符为标准逐行处理
举例:

使用awk '{print $1,$2,$4}' test.txt

原因是逐行执行,第一行没有$4,第二行有

awk变量分为自定义变量和内置变量

内置变量

$0 整行 整行输出可以使用print $0 或者直接print
$NF 最后一个字段
NF 域个数
FS 分隔符
OFS 输出分隔符
RS:输入记录分隔符(输入换行符), 指定输入时的换行符
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NR:行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
实例:
通过NR和NF获取文件中的行号和域个数

awk -F ":" '{print NR,NF}' /etc/passwd


需要注意的是awk中不管内置变量还是自定义变量都不使用$符号($0,$1……除外)
处理多个文件时分别显示行号

awk -F ":" '{print FNR,$0}' /etc/passwd test.txt


awk,grep,sed命令详解,相关实例_第1张图片
改变默认的行分隔符,默认为空格

awk -v RS=" " '{print NR,$0}' test.txt


awk,grep,sed命令详解,相关实例_第2张图片
默认awk输出换行是回车,ORS可以指定输出换行

awk -v ORS="---" '{print NR,$0}' test.txt



如果指定RS和ORS会是什么效果

awk -v RS=" " -v ORS="---" '{print NR,$0}' test.txt


awk,grep,sed命令详解,相关实例_第3张图片
原因是RS指定了空格换行,加上ORS指定了输出是---换行就是这个结果
ARGV和ARGC

awk 'BEGIN{print ARGV[1]}{print NR,$0}' test.txt /etc/passwd


awk,grep,sed命令详解,相关实例_第4张图片
ARGV就是将awk后面的文件名作为一个数组,ARGC代表的是文件数量
awk,grep,sed命令详解,相关实例_第5张图片

 

自定义变量

  • -v 定义自定义变量,方法和使用内置变量一样

    并且可以引用shell变量
  • program中定义,注意的是变量定义和动作需要;隔开

    awk格式化输出printf使用

    printf命令和动作的使用区别,awk使用printf时格式字符串和参数要用,隔开,而直接使用printf不用
    awk,grep,sed命令详解,相关实例_第6张图片

    printf单独使用时%s可以传入多个参数,awk结合使用时参数个数和格式符要一致

    awk,grep,sed命令详解,相关实例_第7张图片

    awk pattern(模式或者条件)

    BEGIN/END模式
    空模式
    关系运算模式
    正则模式
    awk使用正则时,是放到两个/中的

    awk,grep,sed命令详解,相关实例_第8张图片
    1、当在awk命令中使用正则模式时,使用到的正则用法属于"扩展正则表达式"(如果不理解,请参考博客中的"正则表达式"系列文章)。
    2、当使用 {x,y} 这种次数匹配的正则表达式时,需要配合--posix选项或者--re-interval选项。
    *行范围模式

    注意的是关系运算符中有一个~和!~
    用法如下:
    awk,grep,sed命令详解,相关实例_第9张图片
    BEGIN 指定处理文本之前做什么
    END 指定文本处理完成后的动作
    awk 'BEGIN{print "--------------"}{print $0}END{print "--------------"}' test.txt

    -F 指定分隔符
    -v 指定变量

    cat /etc/passwd|awk -F ":" -v OFS="??" ' {print $1,$2}'

    awk [options] 'Pattern{Action}' file
    匹配添加和动作都是在单引号内

     

    awk action(动作)

    {} 和print都是动作,print是输出内容,{}是将多个域名组合成代码块的动作
    awk,grep,sed命令详解,相关实例_第10张图片
    awk,grep,sed命令详解,相关实例_第11张图片
    awk 循环,可使用if else if else while for
    跳过循环continue break

    awk,grep,sed命令详解,相关实例_第12张图片
    退出执行exit,跳过执行next
    awk 数组,可以不申明宿主直接使用,且awk 中的数据下标对应的值可以为空吗,delete可以删除数组元素或者数组

    awk 内置函数

    rand 生成一个0-1的随机数
    srand 搭配rand使用,否则生成的随机数不会变
    awk,grep,sed命令详解,相关实例_第13张图片
    int
    取整
    sub.gsub替换文本
    区别在于gsub是将配到到的字符串全部替换,sub只替换配到到的第一个字符串
    awk,grep,sed命令详解,相关实例_第14张图片
    awk,grep,sed命令详解,相关实例_第15张图片
    length获取字符段长度
    index 获取指定字符在字符串中的位置
    split 切割字符串作为数组
    asort将数组排序,排序后的数组下表将重置
    awk三元运算符
    条件?结果1:结果2

你可能感兴趣的:(linux)