在Linux下进行一些简单的文本处理, 尤其是涉及数据基本过滤加工汇总的,awk 十分方便, 复杂的处理还是用python比较好。总结一下一些 awk 的常用技巧:
按列条件过滤
awk '{print $1, $3}' info.txt # 输出指定列
awk '$2==1 && $5=="ERROR"' info.txt # 按条件过滤,$2是内置变量,表示第二列
awk '$2>1' info.txt # 按条件过滤,如果列为数字,其大小可以作为比较条件
行号
awk '$2==1 && $5=="INFO" || NR==1' # 内置变量NR:表示行号
awk '$2>2 && NR!=1 {printf "line:%u %s\n", FNR, $0}' info.txt # 内置变量FNR:表示文件行号
指定分隔符
awk -F: '{print $1,$3}' info.txt # -F 指定列分隔符,缺省是空格或tab,这里制定冒号
awk -F '[:,]' '{print $1,$3}' info.txt # -F 制定多个列分隔符
格式化输出
awk '$2==0 || NR==1 {printf "%-10s %-10s\n",$1,$5}' info.txt ## printf 用法同C语言中的
字符串匹配
awk '/mode/' info.txt # 匹配含mode的行,引号可不输,类似 grep mode info.txt
awk '!/mode/' info.txt # 匹配不含mode的行,类似于 grep -v 的用法
awk '/mode|mode2/' info.txt # 匹配含mode或者mode2的行,正则匹配用法
awk '$12 ~ /work/ {print $12}' info.txt # 第12列匹配work,指定列进行字符串匹配
awk '$12 !~ /work/ {print $12}' info.txt # 第12列不匹配work,类似于 grep -v 的用法
拆分重定向
awk 'NR!=1{print > $2}' info.txt # 按照第2列进行拆分,第二列一样的内容重定向到以第二列命名的文件里
简单的统计
awk '{sum+=$2} END {print sum}' info.txt # 求第二列的和,END表示处理完毕所有行
root@ubuntu:/media/psf/Home/iLearning/tmp# cat info.txt
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S Mar13 0:01 [kthreadd]
root 3 0.0 0.0 0 0 ? S Mar13 0:05 \_ [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Mar13 0:00 \_ [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S Mar13 22:07 \_ [rcu_sched]
root@ubuntu:/media/psf/Home/iLearning/tmp# awk '{sum+=$2} END {print sum}' info.txt
17