awk 列字符截取

awk 用法

awk ‘条件1{动作1}条件2{动作2}…’ 文件名
条件(Pattern):

  • 一般使用关系表达式作为条件
  • x>10 判断变量 x 是否大于 10
  • x>=10 大于等于
  • x<=10 小于等于

动作(Action)

  • 格式化输出
  • 流程控制语句

执行过程

首先读取文档中第一行的字段,在 awk 中判断条件,条件满足,则执行动作
先将文件名 student.txt 赋值给 $0,把第一个字段赋值给 $1,第二个字段赋值给 $2,第三个字段赋值给 $3,以此类推,然后执行对应动作。
第二行仍重复上述操作,把第一个字段赋值给 $1,第二个字段赋值给 $2……

1
2
[root@yzbtdiy ~]# df -h | grep "/dev/vda1" | awk '{print $5}' | cut -d "%" -f 1 # 截取根分区占用百分比
6

BEGIN

1
2
3
4
5
6
[root@yzbtdiy ~]# awk 'BEGIN{printf "This is a transcript \n"}{printf $2 "\t" $4 "\n"}' student.txt 
This is a transcript
Name Mark
stu1 95
stu2 85
stu3 75

END

1
2
3
4
5
6
[root@yzbtdiy ~]# awk 'END{printf "The end \n"}{printf $2 "\t" $4 "\n"}' student.txt 
Name Mark
stu1 95
stu2 85
stu3 75
The end

FS 内置变量

1
2
3
4
5
6
7
8
9
10
[root@yzbtdiy ~]# cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"}{printf $1 "\t" $3 "\n"}' # awk 先把第一行数据读取,赋予变量后再执行动作,第一行在指定分隔符之前已被赋予变量,因此分隔符在第一行不生效
root:x:0:0:root:/root:/bin/bash
admin 1001
user1 1002
user2 1003
[root@yzbtdiy ~]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}' # BEGIN 在读取数据放入变量前先执行指定分隔符的动作,awk 手工指定分隔符一定要加 BEGIN
root 0
admin 1001
user1 1002
user2 1003

关系运算符

1
2
3
4
5
6
7
8
9
[root@yzbtdiy ~]# cat student.txt
ID Name Gender Mark
1 stu1 F 95
2 stu2 F 85
3 stu3 F 75
[root@yzbtdiy ~]# cat student.txt | grep -v name | awk '$4>=80{printf $2 "\n"}' # 输出分数大于 80 分的学生名单
Name
stu1
stu2