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
posted @ 2021-08-27 16:28  Cai_HL  阅读(30)  评论(0编辑  收藏  举报
>