shell第七章awk的应用

awk选项:模式或者条件(操作)文件

-f :指定分隔符,如果是空格,不需要加f

-v:变量赋值

操作:默认就是打印

awk常用的内置变量:

$0 :打印所有内容

$n :处理行的第几列

NR :处理的行的行号

NF:处理当前行的

奇偶打印:

awk 'NR%2==0'{print} +文件名 偶数打印

awk 'NR%2==1'{print} +文件名 奇数打印

awk运算:

awk 'BEGIN{print 10+20}' 加法

awk 'BEGIN{print 10*20}' 乘法

awk 'BEGIN{print 10/20}' 除法

awk 'BEGIN{print 3^2}' 3的2次方

** ^ 都表示求幂

BEGIN模式:

awk 'BEGIN{..};{..};END{..}' +文件

在对文件操作之前,会先执行BEGIN{..}模式条件,或者时命令操作

中间的{..} 是真正的用于处理文件的命令

END{..} 结束语句,一般都是打印执行结果。

awk 'BEGIN{i=0};{i++};END{printi}' /etc/passwd

打印出来的就是/etc/passwd 中一共有多少行

例题:在文本中把第三列取出来

awk '{print $3}' +文件名

在文本中把第三列和第四列取出来

awk '{print $3,$4}' +文件名

awk作为文本内容过滤

awk '/^root/{print}' /etc/passwd

awk的条件判断打印: awk -F: '$3>10{print}' /etc/passwd | head -n 15 打印出/etc/passwd第三列大于10的,查看15行

awk支持条件判断语句 awk -F: '{if ($3=10){print}}' /etc/passwd

awk条件判断打印: 三元表达式:类似JAVA awk '(条件表达式)' ?(A表达式或者值): (B的表达式或者值) ? 表示if : 表示else i= awk -F: ‘{i=($3>$4)?$3:$4;{print i}}' /etc/passwd

awk的精确筛选: $3>$4 < > = 比较数值 $n~ "字符串":表示第n个字段包含某个字符。 $n!~ "字符串":表示第n个字段不包含某个字符。 $n== "字符串":表示第n个字段就是某个字符。 $n!= "字符串":表示第n个字段不是某个字符。 $NF: 最后一个字段。 head -n 2 /etc/passwd | awk -F : '{print $NF}' awk -F '$7~"bash" {print $1,$NF}' /etc/passwd

例题: 1,第七个字段不是nologin,打印第一个字段和第三个字段 awk -F '$7!="nologin " {print $1,$3} /etc/passwd

2,指定第六个字段为/home/dn,而且第七个字段是/bin/bash

awk -F:'($6=="/home/dn")&&($7=="/bin/bash"){print $1,$NF}' /etc/passwd

3,所有第三列不是0的,或者第四列大于10的结果,打印第一列

awk -F '($3!=0)||($4>10) {print $1}' /etc/passwd

awk和tr相比,改变分隔符

echo a b c d | tr " " ":"

echo a b c d | awk '{OFS=":"; $1=$1;print}'

awk结合数组来进行使用:

在awk当中,怎么样来定义数组

awk 'BEGIN{a[0]=10;a[1]=20; a[2]=30;for(i in a)print i,a[i]}'

awk '{a[$1]++};END{for (i in a)} {print i,a[i]}}' /opt/lsy

面试题:

awk的内置函数,getline

1,如果getline左右没有重定向符号(<,>),或者没有(|)时,awk会先读第一行,但是如果加了getline,将会跳过第一行,读取第二行

awk '{getline;print}' +文件名 偶数打印

awk '{print;getline}' +文件名 奇数打印

2,如果两边有重定向或者管道符,getline作用于定向输入文件

awk '{getline < "test1.txt"; print > "test2.txt"}' test1.txt

ls | awk '{getline ky30 ; print $0, ky30;}'

getline ky30 自定义的变量

ls输出的结果传给ky30

打印ls命令的输出结果

如果没有结果,不做任何操作

3,如何用awk获取这个文件中有多少行 awk 'BEGIN{i=0};{i++};END{printi}' /etc/passwd 打印出来的就是/etc/passwd 中一共有多少行

用awk遍历的方式去重

awk 'BEGIN{a[0]=10;a[1]=20; a[2]=30;for(i in a)print i,a[i]}'

awk '{a[$1]++};END{for (i in a)} {print i,a[i]}}' /opt/lsy

awk -F'[ .]+' '{print $2}' lsy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值