awk
工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理。
awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
在使用awk命令的过程中,可以使用逻辑操作符:"&“表示"与”、"||“”表示"或"、"!“表示"非”
还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
命令格式
awk 选项 ‘模式或条件 {操作}’ 文件1 文件2 …
awk - f 脚本文件 文件1 文件2 …
awk常见的内建变量(可直接用)
FS:列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第n个字段(第n列)。
FILENAME:被处理的文件名。
RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录,i而awk一次仅读入一条记录,以进行处理。预设值是’\ln’
一些awk小应用#awk ‘{print}’ ll #输出ll文本
#awk ‘{print $0}’ ll #输出全部文本
#awk ‘NR==1,NR==3{print $0}’ ll #输出第1和第3行文本
#awk '(NR>=1)&&(NR<=3){print $0}'ll #输出大于等于且小于等于3的文本
#awk ‘(NR>=5)||(NR<=3){print $0}’ ll #或会匹配前面的
#awk ‘(NR%2==0){print $0}’ ll # 取偶数行
#awk ‘/^12/ {print $0}’ ll #查找以12开头的文本
#awk ‘BEGIN {x=0};//bin/bash$/{x++};END{print x}’ /etc/passwd #统计/etc/passwd中以/bin/bash结尾的文件多少行
#grep -c “/bin/bash$” /etc/passwd #上同
#awk -F “:” ‘{print $3}’ /etc/passwd # 以:分隔符截取文件第3段
#awk -F “:” ‘{print $1,$3}’ /etc/passwd #截取第1和第3段
#awk -F “:” ‘$3<5{print $1,$3}’ /etc/passwd #取第3段小于5的行输出其第3和第3行
#awk -F “:” ‘!($3<200){print $1,$3}’ /etc/passwd # 取反输出
#awk ‘BEGIN {FS=":"};{if($3>900);{print $1,$3}}’ /etc/passwd #以:分隔符输出
#awk -F “:” ‘{max=($3>=$4)?$3:$4;{print max}}’ /etc/passwd #:分隔符判断第三行是否大于等于第四行,大于取第三行,否则取第四行
#awk -F: ‘{print NR,$0}’ /etc/passwd # 输出行号
#awk -F: ‘$7~"/bash"{print $1,$3,$7}’ /etc/passwd #输出第7个字段包含/bash行的第一个第二个第七个字段
#awk -F: ‘$1~“root”{print NR,$1,$7}’ /etc/passwd
#echo $PATH | awk ‘BEGIN {RS=":"};END {print NR}’ # echo交给awk处理以:分割输出行号
#echo $PATH | awk ‘BEGIN {RS=":"};BEGIN {RS="/"};{print NR,$0};END {print NR}’ #上同
#awk -F: ‘/bash$/ {print | “wc -l”}’ /etc/passwd # 查找/bash结尾以:分割的行号
#free -m | awk ‘/Mem:/ {print int ($3/($3+$4)*100)"%"}’ # 取内存的比例
#top -b -n 1 | grep Cpu | awk -F, ‘{print $2,$4}’| awk ‘{print int ($1/$3)"%"}’#cpu比例
#seq 10 | awk ‘{getline;print$0}’#getline用法
#seq 10 | awk ‘{print$0;getline}’
#echo “A B C D” |awk ‘{OFS="|";print $0;$5=$5;print $0}’#以|分割A B C D