awk
awk [options] 'commands' filenames
awk [options] -f awk-script-file filenames
options:
-F 定义输入字段分隔符,默认的分隔符是空格或制表符(tab)
字段分隔符: FS OFS 默认空格或制表符
记录分隔符: RS ORS 默认换行符
command:
BEGIN{} {} END{}
行处理前 行处理 行处理后
lab1:
[root@server ~]# awk 'BEGIN{ORS=" "} {print $0}' /etc/passwd
#将文件每一行合并为一行,ORS默认输出一条记录应该回车,加了一个空格
lab2:
[root@server ~]# head -1 /etc/passwd > passwd1
[root@server ~]# cat passwd1
root:x:0:0:root:/root:/bin/bash
[root@server ~]#
[root@server ~]# awk 'BEGIN{RS=":"} {print $0}' passwd1
root
x
0
0
root
/root
/bin/bash
lab3:
[root@server ~]# cat b.txt
server Cai:is a::good boy!
[root@server ~]# awk '{print NF}' b.txt
4
[root@server ~]# awk -F: '{print NF}' b.txt
4
[root@server ~]# awk -F"[ :]" '{print NF}' b.txt
7
[root@server ~]# awk -F"[ :]+" '{print NF}' b.txt
格式化输出:
print函数
date |awk '{print "Month: " $2 "\nYear: " $NF}'
awk -F: '{print "username is: " $1 "\t uid is: " $3}' /etc/passwd
awk -F: '{print "\tusername and uid: " $1,$3 "!"}' /etc/passwd
printf函数
awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}' /etc/passwd
awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
%s 字符类型
%d 数值类型
%f 浮点类型
占15字符
- 表示左对齐,默认是右对齐
printf默认不会在行尾自动换行,加\n
任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发事件
模式:
1、正则表达式:
匹配记录(整行):
awk '/^alice/' /etc/passwd
awk '$0 ~ /^alice/' /etc/passwd
awk '!/alice/' passwd
awk '$0 !~ /^alice/' /etc/passwd
匹配字段:匹配操作符(~ !~)
awk -F: '$1 ~ /^alice/' /etc/passwd
awk -F: '$NF !~ /bash$/' /etc/passwd
2、比较表达式:比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作。比较表达式使用关系运算符,用于比较数字与字符串。
关系运算符
运算符 含义 示例
< 小于 x<y
<= 小于或等于 x<=y
== 等于 x==y
!= 不等于 x!=y
>= 大于等于 x>=y
> 大于 x>y
awk -F: '$3 == 0' /etc/passwd
awk -F: '$3 < 10' /etc/passwd
awk -F: '$NF == "/bin/bash"' /etc/passwd
awk -F: '$1 == "alice"' /etc/passwd
awk -F: '$1 ~ /alic/ ' /etc/passwd
awk -F: '$1 !~ /alic/ ' /etc/passwd
df -P | grep '/' |awk '$4 > 25000'
3、条件表达式:
awk -F: '$3>300 {print $0}' /etc/passwd
awk -F: '{ if($3>300) print $0 }' /etc/passwd
awk -F: '{ if($3>300) {print $0} }' /etc/passwd
awk -F: '{ if($3>300) {print $3} else{print $1} }' /etc/passwd
4、算术运算:+ - * / %(模) (幂23)
awk -F: '$3 * 10 > 500' /etc/passwd
awk -F: '{ if($3*10>500){print $0} }' /etc/passwd
逻辑操作符和复合模式
&& 逻辑与 a&&b
|| 逻辑或 a||b
! 逻辑非 !a
awk -F: '$1~/root/ && $3<=15' /etc/passwd
awk -F: '$1~/root/ || $3<=15' /etc/passwd
awk -F: '!($1~/root/ || $3<=15)' /etc/passwd
范围模式
awk '/Tom/,/Suzanne/' filename
实例:
awk '/west/' datafile
awk '/^north/' datafile
awk '$3 ~ /^north/' datafile
awk '/^(no|so)/' datafile
awk '{print $3,$2}' datafile
awk '{print $3 $2}' datafile
awk '{print $0}' datafile
awk '{print "Number of fields: "NF}' datafile
awk '/northeast/{print $3,$2}' datafile
awk '/E/' datafile
awk '/^[ns]/{print $1}' datafile
awk '$5 ~ /\.[7-9]+/' datafile
awk '$2 !~ /E/{print $1,$2}' datafile
awk '$3 ~ /^Joel/{print $3 " is a nice boy."}' datafile
awk '$8 ~ /[0-9][0-9]$/{print $8}' datafile
awk '$4 ~ /Chin$/{print "The price is $" $8 "."}' datafile
awk '/Tj/{print $0}' datafile
awk '{print $1}' /etc/passwd
awk -F: '{print $1}' /etc/passwd
awk '{print "Number of fields: "NF}' /etc/passwd
awk -F: '{print "Number of fields: "NF}' /etc/passwd
awk -F"[ :]" '{print NF}' /etc/passwd
awk -F"[ :]+" '{print NF}' /etc/passwd
awk '$7 == 5' datafile
awk '$2 == "CT" {print $1, $2}' datafile
awk '$7 != 5' datafile