字符截取命令-awk

awk命令的作用

上节说了cut命令的作用,但cut命令具有局限性,例如不能识别空格作为分割符,awk命令解决了这一问题,并且具备其它一些更好的功能。cut命令具有的功能awk都有,但在一般情况下只要使用cut命令即可。

awk命令基本语法格式

awk '条件1{动作1}条件2{动作2}...'文件名
条件(Pattern)
  一般使用关系表达式作为条件
    x>10  判断变量x是否大于10
    x=10  判断变量x是否等于10
    x<10
动作(action)
         格式化输出
         流程控制语句

案列演示

test文件的内容如下:

现在要提取第二列和第四列:

awk '{printf $2 "\t" $4 "\n"}' test.txt

使用 df -h 可以查看磁盘的使用情况

现在我们想提取第一列和第五列:

df -h | awk '{print $1 "\t" $5}'

printf和print的区别:

printf是linux中的标准输出命令,而print只能用在awk命令中用作输出。printf后面不带换行,print后面自带一个换行符\n

现在我们想提取第五列中的数字用作判断磁盘的使用情况

df -h | grep sda5 | awk '{print $5}' | cut -d % -f 1

BEGIN

BEGIN是一个条件,当执行awk的动作之前先执行BEGIN后面的条件语句

awk 'BEGIN{print"hello,world"}{print $1 "\t" $4}' test.txt

FS内置变量

FS可以指定分割符来输出

cat /etc/passwd | grep /bin/bash | awk '{FS=":"}{print $1 "\t" $3}'

可以看到已经输出了第一列和第三列,但是第一行那个是什么鬼
因为awk命令在处理是会先将第一行读取出来,在进行后续的处理。所以第一行没有按照:为分割符进行分割
该如何解决这个问题呢,在指定分割符前面加一个BEGIN,让程序执行时先读取分割符子进行处理

cat /etc/passwd | grep /bin/bash | awk 'BEGIN {FS=":"}{print $1 "\t" $3}

END

END和BEGIN一样,只不过END是在awk执行完成后输出指定条件语句

awk 'END{print"hello,world"}{print $1 "\t" $4}' test.txt

关系运算符

awk ' $3>80 {print $2}' test.txt

输出分数大于80的学生名字