sed是以行为单位的文本处理工具,awk是以列为单位的文本处理工具。
awk按行读取文本视为一条记录,每条记录以字段分割成若干字段,输出各字段值。
awk认为文件是结构化的,由单词和各种空白字符组成。
空白字符包含空格、Tab,以及连续的空格和Tab等。
非空白的部分叫做“域”,从左到右依次是第一个域,第二个域,等等。
$1、$2分别表示域,$0表示全部域。
默认情况下,awk是以空白字符作为分隔符,可以通过-F参数指定分隔符。
cat awk.txt
john.a male 30 021-8123445
mike.b male 31 021-8123446
lily.c male 32 021-8123447
打印第一个和第四个域(姓名和电话):awk '{print $1,$4}' awk.txt
打印全部内容:awk '{print $0}' awk.txt
打印.分隔符区分的内容:awk -F . '{print $1,$2}' awk.txt
使用默认分隔符和内部变量NF获取每行列数:awk '{print NF}' awk.txt
使用指定分隔符和内部变量NF获取每行列数:awk -F . '{print NF}' awk.txt
打印最后一列:awk '{print $NF}' awk.txt
打印倒数第二列:awk '{print $(NF-1)}' awk.txt
截取字符串:substr(指定域,第一个开始字符位置,第二个结束的位置)
第二个结束的位置可以为空,默认输出到该域的最后一个字符
打印第一个域的第六个字符到最后一个字符的内容:cat awk.txt | awk '{print substr($1,6)}'
使用length获取字符串长度:cat awk.txt | awk '{print length}'
使用awk求列和
求年龄的和:cat awk.txt | awk 'BEGIN{total=0}{total+=$3}END{print total}'
求平均年龄(NR表示文件行数):cat awk.txt | awk 'BEGIN{total=0}{total+=$3}END{print total/NR}'