awk命令笔记
awk是啥?
awk(奥克)是linux中一个强大的分析工具,linux面试必考
[root@rainbol ~]# awk Usage: awk [POSIX or GNU style options] -f progfile [--] file ... Usage: awk [POSIX or GNU style options] [--] 'program' file ... POSIX options: GNU long options: (standard) -f progfile --file=progfile -F fs --field-separator=fs -v var=val --assign=var=val Short options: GNU long options: (extensions) -b --characters-as-bytes -c --traditional -C --copyright -d[file] --dump-variables[=file] -e 'program-text' --source='program-text' -E file --exec=file -g --gen-pot -h --help -L [fatal] --lint[=fatal] -n --non-decimal-data -N --use-lc-numeric -O --optimize -p[file] --profile[=file] -P --posix -r --re-interval -S --sandbox -t --lint-old -V --version To report bugs, see node `Bugs' in `gawk.info', which is section `Reporting Problems and Bugs' in the printed version. gawk is a pattern scanning and processing language. By default it reads standard input and writes standard output. Examples: gawk '{ sum += $1 }; END { print sum }' file gawk -F: '{ print $1 }' /etc/passwd
普通打印
awk '{print}' access.log #打印所有列 或者 $0 awk '{print $1}' access.log #打印第一列 awk '{print $1,$4}' access.log #打印第一列第四列,注意中间用英文逗号分隔 awk '{print $1,"\t",$4}' access.log #\t表示在每一列使用制表符之间对齐,方便查看格式
awk '{print $1 $4}' access.log #如果不加逗号或者加入空格,awk做拼接操作,$1和$4就拼接在一起,所以','为awk默认分隔符,其代表一个空格
#
行列号打印 NR(number of record) NF(field of record)
awk '{print NR "\t" $1,"\t",$4}' access.log #在第一列插入行号 awk '{print NF "\t" $1,"\t",$4}' access.log #在第一列插入该行的所有列(注意: awk默认是以空格计算间隔的列)
awk '{print $NF}' access.log #打印最后一列的内容
awk '{print $(NF-1)}' access.log #打印最后第二列的内容
逻辑判断式
awk '$1!="192.168.1.1" {print $1 ,$4}' access.log #打印第一列中没有192.168.1.1的ip号,注意不加引号默认为数字判断
awk 'NF!=2 {print $0}' access.log #打印中NF中不是2段的数据
自定义分割符
#输入分割符 awk 'BEGIN{FS=","}{print $1,$2}' access.log #将默认空格分割符变为默认','分割符,使得遇到','自动分割 #输出分割符 awk 'BEGIN{OFS=","}{print $1,$2}' access.log #将输出的默认空格分割符变为','
awk 'BEGIN{FS=",";OFS=","}{print $1,$2}' access.log #将输出的默认空格分割符变为','
多文件拼接
awk '{print $0}' a.txt b.txt ... #多文件拼接直接在文件后面加文件就行了 awk '{print FIRENAME,$0}' a.txt #FIRENAME加入一列文件名,方便查看文件 awk '$1="**.**.**.**"{print $0}' access.log #如果不想要别人看到某一列的内容并替换为其他可以这么写
甚至还可以计算
[root@rainbol logs]# awk '{a=1;b=3;print a+b}' 4
#但注意如果字符串中数字和其他字符拼接在一起,如:a = 'aa123',b不变,那么结果为3,如果a='123aa',b不变,结果为126
awk正则表达式
/abc/ #可以 "abcxx" "xxxabcxxx"
#不可以 "axxbxxc" "ab c" 只要abc连续都配置
awk '/abc/{print$0}' a.txt #按行搜索只有符合正则的行都打印出来
/a.c/ #可以 "abc" "a c" #不可以 "acb" "ac" "aaacc" .表示任意字符,注意是一个,如果用两个那就是/a..c/,如果就是想匹配a.c怎么办,使用转义字符/a\.c/
/^abc/ #可以 "abcsad" #不可以 "aabc" ^表示匹配字符串开头的,abc要出现在最前面才行 $与其正好相反,/abc$/表示abc要出现在最后面才行
/a[123]c/ #可以 "a1c" "a2c" "a3c" #不可以 "abc" "a11c" 括号表示a和c中间必须包括1,2,3中间的任意一个就行了 当还可以这样/a[a-z]c/ /a[0-9]c/ /a[A-Z]c/ /a[a-zA-Z0-9]/
/a[^a-z]c/ #在方括号中出现^表示非,也就是不能出现a-z的字母 所以"abc"是错的
/a*c/ #可以 "aaaaaac" "c" #不可以 "ccca" # *表示匹配0个或者多个a,匹配为*号前面的一个字符 /a+c/ #可以 "ac" "aaaaac" #不可以 "c" # +表示匹配1个或者多个a,匹配为+号其那面的一个字符 /a?c/ #可以 "c" "ac" #不可以 "aaaac" # ?表示匹配0个或者1个a,匹配为?号前面的一个字符
/ab{3}c/ #可以 "abbbc" #不可以 "abc" "abbc" #{}表示匹配次数,{3}表示前面一个字符必须要出现3次才能匹配,多也不行少也不行
/ab{3,5}/ #逗号表示 到..之间都可以,可以出现3次或者出现4次或者出现5次,并且包括3和5
/ab{3,}c/ #出现包括3个b,后面多少b都无所谓
/(ab)+c/ #可以 "abc" "ababc" #不可以 "abbc" # ()小括号表示在括号内看做一个整体,小括号后面可以接匹配规则
其他