awk文本处理工具

awk:

awk也是按行来进行操作的,但是对行操作完之后可以根据指定命令来对行取列

awk的分隔符:他的默认分割符是空格或者tab键,多个空格,它会自动压缩成一个空格

用法:

格式: awk 选项 '模式或者条件{操作}'文件

操作默认为打印

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

-v:变量赋值

awk常用的内置变量:

$0:打印所有内容

$n:处理行的第几列

NR:处理的行的行号

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

FS:列分隔符,表示文本的分割符和F的作用一致。格式FS=";"

OFS:输出文本的分隔符

RS:指定分隔符为回车

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

打印:print

0{print}:没有

1{print}:打印全部

{print NR}:只打印行号

{print NR,$0}:打印行号加内容

{print $0}:打印全部

NR==3{print}:打印第三行

NR==2,NR==4{print}:打印第二行到第四行

NR==2;NR==4{print}:打印第二行和AWK第四行

awk "NR&2==0{print}':偶数打印

awk "NR&2==1{print}':基数打印

运算:

BEGIN{print 10+20}:加法

BEGIN{print 10*20}:乘法

BEGIN{print 10/20}:除法

BEGIN{print 3**2}:求幂,3的2次方

BEGIN{print 3^2}:求幂,3的2次方

BEGIN{print 10.34+10.56}:支持小数运算

awk的内置函数:getline

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

2.如果两把有重定向符

面试题:利用awk重定向输出

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

awk进行文本内容过滤打印

awk '/^root/{print}' /etc/passwd:以root为开头

awk '/bash$/{print}' /etc/passwd:以bash为结尾

BEGIN模式:

格式:awk 'BEGIN{..};{..};END{..}' 文件名

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

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

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

面试题:通过awk获取文件中有多少行

awk 'BEGIN{i=0};{i++};END{print i}'

awk条件判断打印:

awk -F: '$4<10{print}' /etc/passwd | head -n 15:打印15行第四列比10小的行

awk -F: '!($4<10){print}' /etc/passwd | head -n 15:取反

awk -F: '{if ($3>10) {print}}' /etc/passwd:如果第三列大于10则打印

三元表达式:

awk '{(条件表达式)?(A表达式或值):(B的表达式或值)}'

? 表示if

: 表示else

awk -F: '{i=($3>$4)?$3:$4;{print i}}' /etc/passwd

awk的精确筛选:

<、>、=:比较数值

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

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

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

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

指定第六个字段为/home/hqy 而且 第七个是/bin/bash,打印第一段和最后一段

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

awk结合数组来进行使用

定义数组

awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;print a}'

你可能感兴趣的:(linux)