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"

# ()小括号表示在括号内看做一个整体,小括号后面可以接匹配规则

 

其他 

  猛击这里

 

posted @ 2019-08-04 13:19  RainBol  阅读(215)  评论(0编辑  收藏  举报
Live2D