Linux中awk命令的一些常见用法

awk在Linux是很重要的存在,是一种模式扫描和文本处理语言,大家可能更熟悉的是grep,也属于对文本的处理,这节主要是介绍awk的用法,方便后期熟练使用,如果对于熟悉本人前面文章的伙伴们来说,awk的命令在 JetsonNano搭载的扩展板的OLED显示屏的使用(实时显示IP、内存、CPU等)出现过,而且是一个很好的示例。

vi test

输入下面的内容进行测试,然后按键Esc 之后 输入:wq回车保存即可

如果想要重新输入一些内容进行测试,可以全部删除,按键Esc 之后输入:1,.d回车即可

文件test的内容如下:

Tony-ChyiChin-GoodMan-Nice
你好-中国
VERY GOOD
123456789
I love you

-F"分隔符"

默认是以空格为分隔符,可以像下面这样,不需要指定分隔符

awk '{ print $0 }' test

这个和cat test效果一样

接着查看下面几个的结果:

awk '{ print $1 }' test
awk '{ print $2 }' test
awk '{ print $3 }' test

如果是一个或多个空格的情况,需要将多个空格显示出来,如何处理?

cat t.txt
a b  c   d

这里分别是一个空格两个空格和三个空格

awk '{print $1$2$3$4}' t.txt #abcd
awk -F[[:space:]] '{print $1$2$3$4}' t.txt #a b  c   d

看出规律了吧,既然是一种模式匹配的语言,那这个跟正则表达式其实一样,每行默认是空格分隔符来进行隔开,然后就是进行分组,可以对每个分组进行各自获取与输出

当然也可以通过-F来指定分隔符,比如下面是通过"-",来对每行文本进行分隔:

扫描二维码关注公众号,回复: 14835018 查看本文章
awk -F"-" '{ print $1 }' test
awk -F"-" '{ print $2 }' test
awk -F"-" '{ print $3 }' test
awk -F"-" '{ print $4 }' test

指定多个分隔符

比如下面这个正则表达式,表示的是1个或多个的空格或"-"或","来隔开,其中[]后面的+号熟悉正则表达式知道,表示1个或多个

awk -F '[ -,]+' '{print $1" "$3}' test
'''
aaaa ccc
Tony-ChyiChin-GoodMan-Nice 
你好-中国 
VERY 
123456789 
I you
'''

其中这里的内容我修改了,增加了aaaa,bbb,ccc,ddd,eeee这样一行,尤其注意观察第一行和最后一行,可以看到第一行是逗号隔开了,最后一行是空格隔开,然后取第一个和第三个。

if条件

如果文本内容行数很多,我们可以选择性打印想要查看的行数内容

大于1行小于等于4行的所有内容,这里的NR就表示读取记录的行数

awk '{if(NR>1 && NR<=4) print $0}' test
'''
你好-中国
VERY GOOD
123456789
'''

BEGIN END

BEGIN END可以做一些统计,比如说统计账户数:

awk 'BEGIN {count=0;print "[start] user count is ",count}{count++;print $0;} END{print "user count is ",count}' /etc/passwd
'''
[start] user count is  0
root:x:0:0:root:/root:/bin/bash
......
user count is  41
'''

当然一行比较长的话,可以在一行的后面使用"\"反斜杠符号,这样就可以将其余部分写到下面一行来,比如统计上面test文件里的内容有多少行:

awk 'BEGIN{count=0;print "[start] line count is ",count} \
{count+=1;print $0} \
END{print "[end] line count is ",count}' test

关系运算符

布尔运算,逗号隔开是一个表达式,真为1,假为0

awk 'BEGIN{a=2;b=3;print (a+b>4,a*b==6,a-b>0||a>1,a-b>0&&a>1)}' #1 1 1 0

赋值运算

awk 'BEGIN{a=1;a+=2;b=-8;print a+b}'

正则表达式

awk 'BEGIN{a="23hello";if(a~/23[h]/) {print "Yes"}}' #Yes
awk 'BEGIN{a="23hello";if(a~/d*[h]/) {print "Yes"}}' #Yes

gsub替换,将数字替换成"**"

awk 'BEGIN{info="Godfather 1 released on March 24, 1972";gsub(/[0-9]+/,"**",info);print info}'
#Godfather ** released on March **, **

查找字符串是否存在

awk 'BEGIN{info="Godfather 1 released on March 24, 1972";print index(info,"father")?"ok":"not found";}'
#ok

查找是否包含数字

awk 'BEGIN{info="Godfather 1 released on March 24, 1972";print match(info,/[0-9]+/)?"ok":"not found";}'
#ok

截取字符串

awk 'BEGIN{info="Godfather 1 released on March 24, 1972";print substr(info,5,10);}'
#ather 1 re

当然awk的功能远不止这些,不过对于平时的一些操作来说基本可以满足了

猜你喜欢

转载自blog.csdn.net/weixin_41896770/article/details/129792529