强大的文本分析
awk处理过程: 依次对每一行进行处理,然后输出
awk [选项参数] 'script' var=value file(s) 或 awk [选项参数] -f scriptfile var=value file(s)
默认分隔符-按空格或TAB分割
】每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
】格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
】awk -F #-F相当于内置变量FS, 指定分割字符
1)$ awk -F, '{print $1,$2}' log.txt
2)# 或者使用内建变量 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
】使用多个分隔符
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
】用法三: awk -v # 设置变量
$ awk -va=1 '{print $1,$1+a}' log.txt
$ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
】过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
】过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
】过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
】# 输出顺序号 NR, 匹配文本行号 $ awk '{print NR,FNR,$1,$2,$3}' log.txt
】 # 指定输出分割符 $ awk '{print $1,$2,$5}' OFS=" $ " log.txt
】# 输出第二列包含 "th",并打印第二列与第四列 $ awk '$2 ~ /th/ {print $2,$4}' log.txt
ps: ~ 表示模式开始。// 中是模式。
】# 输出包含"re" 的行 $ awk '/re/ ' log.txt
】忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
】模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
$ awk '!/th/ {print $2,$4}' log.txt
参考http://www.runoob.com/linux/linux-comm-awk.html
】第一列 : last -5 | awk '{print $1}'
】 获取第一列并去重 : last -5 | awk '{print $1}' | uniq
】 : 分隔符 : #cat /etc/passwd |awk -F ':' '{print $1}'
】如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
#cat /etc/passwd |awk -F ':' '{print $1"\t"$7}' root /bin/bash daemon /bin/sh bin /bin/sh sys /bin/sh
】在输出的开头和结尾添加输出
在所有行前添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
|
】搜索含有某关键字的行-(找出含有关键字‘man’的行)
cat '/etc/passwd' | awk -F : '/man/{print $0}' input.txt
条件判断-把文件text中第二列大于10的行的第一列+“is expensive”输出
cat text | awk -F '\t' '$2 >= 10 {print $1, " is Expensive"}'
Banana 0.89
Paech 8.79
Kiwi 11.50
Pineapple 1.29
Apple 10.99
结果:
Kiwi is Expensive Apple is Expensive
把文件text中第二列大于10的输出“is expensive”,小于9的输出“is cheap”
cat text | awk -F '\t' '$2 >= 10 {print $1, " is Expensive"} $2 <= 9 {print $1 " is cheap"}' Banana is cheap Paech is cheap Kiwi is Expensive Pineapple is cheap Apple is Expensive
打印$4 包含 Brown 的行
awk '$4~/Brown/ {print $0}' grade.txt
#精确匹配
awk '$3=="48" {print $0}' grade.txt
P.Bunny 02/99 48 Yellow 12 35 28
不匹配 使用 ‘!~’
zhuyupeng@zhuyupeng-PC ~
$ awk '$0 !~ /Brown/' grade.txt
awk '$4 != "Brown-2" {print $0}' grade.txt
小于
awk '$6 < $7 {print $0 "$1 Try better at the next comp"}' grade.txt
M.Tansley 05/99 48311 Green 8 40 44$1 Try better at the next comp
J.Lulu 06/99 48317 green 9 24 26$1 Try better at the next comp
打印第8行
➜ testlinux git:(master) ✗ awk 'NR==8{print $0} ' a.txt
555855
➜ testlinux git:(master) ✗ awk 'NR==8 {print $0}' a.txt
555855
功能是打印所有输入行
awk '{print $0} ' f ilename
打印每行字段数
awk -F: '{print NF,$0} ' f ilename
打印字段数大于等于4个的行
Awk -F: ‘NF>=4{print $0} ’ f ilename
打印UID在 30-40范围内的用户名
Awk -F: '$3>=30&&S3<=40{print $1}' f ilename
Awk '$1>=30000000&&S1<=400000000 {print $1}' a.txt
if/else
打印:第1列*第2列的值大于100的行
awk '$1 * $2 >100 {print $1}' file 显示文件中第一个域匹配101的行(记录)
修改某个列后打印
awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行后先将第3个域替换后再显示该行(记录)。
awk '{$7 %= 3; print $7}' file 将第7域被3除,并将余数赋给第7域再打印。
给变量赋值后打印
awk '/tom/ {wage=$2+$3; printf wage}' file 找到匹配行后为变量wage赋值并打印该变量。
END表示在所有输入行处理完后进行处理。
testlinux git:(master) ✗ awk '/123444/ {count++;}
END {print "tom was found "count" times"}' a.txt
tom was found 12333 times
把file1、file2、file3的文件内容全部写到fileall中,格式为
打印文件并前置文件名。
awk '{ print FILENAME,$0 }' a.txt b.txt>fileall.txt
对a.txt文件的第四个域进行求和!
awk 'BEGIN{total=0}{total+=$4}END{print total}' a.txt
开头
打印日志
awk '{print $1,$2,$3}' error.log
结果:
INFO 2018-12-24 15:50:00
INFO 2018-12-24 15:50:00
INFO 2018-12-24 15:51:00
INFO 2018-12-24 15:51:00
INFO 2018-12-24 15:52:00
INFO 2018-12-24 15:52:00
INFO 2018-12-24 15:53:00
INFO 2018-12-24 15:53:00
INFO 2018-12-24 15:54:00
INFO 2018-12-24 15:54:00
INFO 2018-12-24 15:55:00
INFO 2018-12-24 15:55:00
INFO 2018-12-24 15:56:00
INFO 2018-12-24 15:56:00
INFO 2018-12-24 15:57:00
INFO 2018-12-24 15:57:00
error.log
INFO 2018-12-24 15:56:00 RunBusiness.class 230 Line 任务是否可执行,task_id=115,最终状态=false,status=0,auto_task_rules_id=178
INFO 2018-12-24 15:57:00 MyJob.class 56 Line 调度开始了,id=178,uuid=8e5d5ba7-badf-4a73-804d-63b7814c40bd,task_id=115
INFO 2018-12-24 15:57:00 RunBusiness.class 230 Line 任务是否可执行,task_id=115,最终状态=false,status=0,auto_task_rules_id=178
INFO 2018-12-24 15:58:00 MyJob.class 56 Line 调度开始了,id=178,uuid=8e5d5ba7-badf-4a73-804d-63b7814c40bd,task_id=115
INFO 2018-12-24 15:58:00 RunBusiness.class 230 Line 任务是否可执行,task_id=115,最终状态=false,status=0,auto_task_rules_id=178
字符串比较/日期比较
awk '$3>"16:03:00"{print $1,$2,$3}' error.log
awk '$3=="16:03:00"{print $1,$2,$3}' error.log
awk 字符拼接
awk字符串转数字
逻辑:只需要将变量通过”+”连接运算。自动强制将字符串转为整型。非数字变成0,发现第一个非数字字符,后面自动忽略。
awk 'BEGIN{a="100";b="10test10";print (a+b+0);}'
awk数字转为字符串
逻辑:只需要将变量与””符号连接起来运算即可。
awk 'BEGIN{a=100;b=100;c=(a""b);print c}'
100100
awk字符串连接操作
[chengmo@centos5 ~]$ awk 'BEGIN{a="a";b="b";c=(a""b);print c}'
ab
[chengmo@centos5 ~]$ awk 'BEGIN{a="a";b="b";c=(a+b);print c}'
0
字符串连接操作通”二“,”+”号操作符。模式强制将左右2边的值转为 数字类型。然后进行操作。
更高级用法
https://www.cnblogs.com/www1707/p/5447990.html
参考
https://www.cnblogs.com/kaituorensheng/p/3919212.html
https://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591822.html
http://blog.51cto.com/ko178/1734417
https://www.cnblogs.com/emanlee/p/3327576.html
https://www.jb51.net/LINUXjishu/118076.html