简介
awk是一种处理文本文件的语言,是一个强大的文本分析工具,grep、sed、awk并称为shell中文本处理的三剑客。
shell命令三剑客的比较
- grep更适合单纯的查找或匹配文本
- sed更适合编辑匹配到的文本
- awk更适合格式化位版本,对文本进行复杂格式处理。
awk命令与sed一样,均是一行一行的读取、处理。区别在于sed作用与一整行的处理,而awk将一行分成数个字段来处理
awk命令详解
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options: GNU long options: (standard)
-f progfile --file=progfile //通过文件读入awk命令,-f filename
-F fs --field-separator=fs //指定分隔符号,默认是通过空格和tab进行隔开,指定冒号为分隔符 -F:
-v var=val --assign=var=val //赋值一个用户定义变量
Short options: GNU long options: (extensions)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[file] --dump-variables[=file]
-D[file] --debug[=file]
-e 'program-text' --source='program-text'
-E file --exec=file
-g --gen-pot
-h --help
-i includefile --include=includefile
-l library --load=library
-L[fatal|invalid|no-ext] --lint[=fatal|invalid|no-ext]
-M --bignum
-N --use-lc-numeric
-n --non-decimal-data
-o[file] --pretty-print[=file]
-O --optimize
-p[file] --profile[=file]
-P --posix
-r --re-interval
-s --no-optimize
-S --sandbox
-t --lint-old
-V --version
awk用法
awk完成语法
awk [选项参数] 'BEGIN{commands} pattern{commands} END{commands}' file
简单用法
awk ‘/模式/{动作}’
这个用法简单来说就是通过模式筛选,然后通过动作处理
- awk命令需要用单引号
- awk动用用花括号包裹
- 模式是指正则匹配或者条件表达式,或者两者混用
- 正则需要使用’/'作为界定符
- 多个动作之间用分号隔开
示例1,只有模式时,相当于grep,可以进行匹配搜索等
在awk的正则中’^‘、’<‘,都是表示以什么开头,’$‘,’>'以什么结尾
awk '/^root/' /etc/passwd
awk '/\>root/' /etc/passwd
awk '/bash$/' /etc/passwd
awk '/bash\>/' /etc/passwd
示例2 只有动作,则执行动作
who |awk '{print $1}'
示例3 ,使用-F分割
awk -F: '/^[rp]/{print $1,$7}' /etc/passwd
// 以r或者p开头,打印第一个和第7个字段
awk正则中^ 在中括号内外的意思同样不一样,括号内表示取反,括号外表示开头
awk -F: '/^[^rp]/{print $1,$7}' /etc/passwd
//不以r或p开头的行的第一个和第七个字段
这个有点高级,可以指定两个分割符号
awk -F'[:/]' '{print $1,$10}' /etc/passwd
//以冒号或者左斜杠作为分隔符显示第1列和第10列
awk的操作符
- 数学运算:+,-,*,/, %,++,–
- 逻辑关系符:&&, ||, !
- 比较操作符:>,<,>=,!=,<=,==,(匹配正则表达式),!(不匹配正则表达式)
- 文本数据表达式:== (精确匹配)
- ~波浪号表示匹配后面的模式
在加入操作符之后,就可以进行更加复杂一些的匹配筛选,从而使精度得到提升。
who | awk '$2 ~ /pts/{print $1}' //在$2里查找匹配/pts/的,有就输出$1
seq 10 | awk '$1 % 5 == 0 || $1 ~ /^1/{print $1}' //输出1~10能被5整除的或者以1开头的数字
awk命令内置函数
length函数
利用length计算字符数目的函数来检查有无空口令用户
awk -F: 'length($2)==0{print $1}' /etc/passwd /etc/shadow
system函数
该函数可以用来执行系统命令
利用awk的system命令在/tmp/lp下建立/etc/passwd中与用户名同名的目录
awk -F: '{system("mkdir /tmp/lp/" $1)}' /etc/passwd
awk结构化语句
单分支
awk -F: '{if($1 ~ /\<...\>/)print $0}' /etc/passwd //如果用户名长度为三,则打印整行
双分支以及多分支
awk -F: '{if($3 != 0) print $1 ; else print $3}' /etc/passwd //双分支
awk -F: '{if($1=="root") print $1;else if($1=="ftp") print $2;else if($1=="mail") print $3;else print NR}' /etc/passwd //多分支
示例:利用awk的if多重分支判断用户的类型,root显示为管理员,uid在(0,500)显示为系统用户,uid在[500,60000]之间显示为普通用户,大于6万显示为其他用户。
awk -F: '{if($3==0) print $1,"管理员";else if($3>0 && $3<500) print $1,"系统用户";else if($3>=500 && $3 <= 60000) print $1,"普通用户";else print $1,"其它用户"}' /etc/passwd
如果想要更加详细的学习,可以看一下,参考链接,有一些更高级的用法,更详细的例子
参考
https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
https://blog.csdn.net/qq_18312025/article/details/105588874
https://wangchujiang.com/linux-command/c/awk.html