awk
语法形式
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
主要分成三块
- BEGIN块:只会执行一次,常用于变量初始化
- pattern块:awk是以行为单位处理的。每读取一行,就是用pattern块进行处理
- END块:也是执行一次,在所有行处理完后执行,一般用于打印一些统计结果
cat /etc/passwd | awk 'BEGIN{sum=0} pattern{sum++} END{printf "%s\n",sum}'
对于每一行,通过分隔符进行分割成若干个字段,然后使用$1,$2… 来调用。
默认的分割符是空格和制表符。可以使用-F参数来指定分割符
$ echo 'name:acount:passwd'|awk -F ':' '{ print $3 }'
passwd
内置变量
- FILENAME:当前文件名
- FS:字段分割符,默认是空格和制表符
- NF:Number of Field,当前行的字段的个数,字段数量
- BR:行号,当前处理的文本行的行号
- RS:行分隔符,用于分割每一行。默认是换行符
- OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
- ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
echo 'name:acount:passwd'|awk -F ':' '{ print $(NF-1) }'
使用正则表达式
正则表达式放在pattern的位置,这里使用”:”作为分行符
echo 'name:account:passwd'|awk 'BEGIN{RS = ":"} $0~/.*c.*/ {print $0}'
也可以使用if else 语句处理
echo 'name:account:passwd'|awk 'BEGIN{RS = ":"} $0~/.*c.*/ {print $0}'
echo 'name:acount:passwd'|awk 'BEGIN{RS = ":"} {if($0!~/.*c.*/) print $0; else print "---"}'
内置函数
- tolower():字符转为小写。
- length():返回字符串长度。
- substr():返回子字符串。
- sin():正弦。
- cos():余弦。
- sqrt():平方根。
- rand():随机数。