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