Linux(文本编辑器awk)

awk

awk概念:

        awk是功能最强大的文本工具,也是按行来进行操作的,对行操作完之后你,可以根据指定命令来对行取列

        awk的分隔符:awk的默认分隔符就是空格或者tab键(多个空格会自动压缩成一个)

        用法格式:awk 选项 '模式/条件 {操作}' 文件

        操作:默认就是打印(打印多列加,;$0打印全部)

awk常用选项


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

-v:变量赋值

awk常用的内置变量
$0:打印所有内容

$n:处理行的第几列

NR:处理行的行号

NF:处理当前行的字段个数,$NF就表示最后一个字段

FS:列分割符,指定文本的分隔符,和F作用一致 FS 需要使用“” (双引号)

OFS:输出文本的分隔符

RS:指定分隔符为回车

注:内置变量$n要加$,其他的内置变量不需要加$,更不能加引号,括号,否则会被当做字符串来处


打印:
                awk '{ $1}' test.txt  #打印第一列

                awk '{print $1,$2,$3}' test.txt  #打印第一,第二,第三列

                awk '{ print $0}' test.txt # $0为打印所有内容

                awk '{print NR}' test.txt #只打印行号

                awk '{print NR,$0}' test.txt #既打印行号又显示全部内容

查找打印:
                awk 'NR==3{print}' test.txt  #指定第三行进行打印

                awk 'NR==1,NR==3{print}' test.txt  #打印第一行到第三行

                awk 'NR==1;NR==3{print}' test.txt #打印第一行和第三行


奇偶打印:


awk 'NR%2==0 {print}' test.txt #打印偶数行

awk 'NR%2==1 {print}' test.txt #打印奇数行


awk运算(固定格式):

默认支持小数运算(** 和^都表示求幂)


 

awk的内置函数:getline

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

awk '{getline;print}' test.txt #相当于偶数行打印

awk '{print;getline}' test.txt  #相当于奇数行打印


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

awk ’{getline < “test1.txt”;print>“test2.txt”}‘ test1.txt


awk 文本过滤(类似于grep):

                awk '/^root/{print}' /etc/passwd #以root开头的行

                awk '/bash$/{print}' /etc/passwd #以bash结尾的行 

怎么通过awk获取文件内容多少行?

三元表达式:类似于java

三元表达式命令格式:awk '(条件表达式)?(A表达式或者值):(B的表达式或者值)'

打印1到6行,如果第三列大于第四列,输出第三列,否则输出第四列

合并去重计算

awk '{a[$1]++};END{for (i in a){print i,a[i]}}' 文件名


BEGIN模式

awk 'BEGIN{..};{..};END{..}'文件                          #在对文件进行操作之前,会先执行BEGIN{..}模式条件,或者命令操作。中间的{..}是真正的用于处理文件的命令;

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

例如:awk 'BEGIN{i=0};{i++};END{print i}' /etc/passwd #打印/etc/passwd的总行数

awk支持条件判断打印

条件判断:$$(and) || (or)

#打印第六列是/home/test1 或者 第七列是/bin/bash的

awk的精确筛选

>;<;= 用于比较数值

$n~ ”字符串“:表示第n个字段包含某个字

$n!~ ”字符串“:表示第n个字段不包含某个字符

$n==”字符串“:表示第n个字段就是某个字符

$n!=”字符串“:表示第n个字段不是某个字符

$NF:最后一个字段

awk 结合数组来进行使用

定义数组:awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30; print a[1]}'

例:
awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd                 #第七列包含bash,打印第一个字段和最后一个字段

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

awk -F: '($6=="/home/my")||($7=="/bin/bash"){print $1,$NFS}' /etc/passwd

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

猜你喜欢

转载自blog.csdn.net/ZZZ_CCC01/article/details/131941690