awk [选项] '哪一行{print 哪一列}' [file]
#逻辑:按行取列,先将符合条件的行尽数找出,再对其中的某一列进行选取;
#awk本质上其实是一种编程语言,其中可以进行运算;
-F "" #指定分隔符;
#当语法形式中的`{print 哪一列}`为空即为取行
1.指定某行或某几行
语法形式:
awk 'NR[运算符]n' file
使用awk内置变量:
NR --> 存储每行的行号
运算符:
== 等于
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 不等于
&& 且
|| 或
#可使用内置函数取出文件内容的最后一行
awk 'END{print}' file
2.模糊过滤取行
语法形式:
awk '模式' file
模式'可以使用正则符号':
// #模糊查找文件中的字符串
//,// #模糊查找两字符串之间的内容
语法形式:
awk [选项] '[取列内置变量] [模式匹配符] "[表达式]"' file
模式匹配符:
== #某列等于……
!= #某列不等于……
~ #使用正则匹配字符串
!~ #使用正则匹配字符串并取反
表达式:
任意字符
正则表达式
语法形式:
awk [选项] '[取列内置变量] [模式匹配符][运算符]n' file
#当语法形式中的`哪一行`为空即为取列
语法形式:
awk '{print [内置变量]}' file
awk内置变量:
$0 # 表示整行
$n # 表示文件的第n列
, # 逗号表示空格
NF # 表示每一行最后一列的列号
$NF # 表示最后一列;`$(NF-1)`表示倒数倒数第二列 --> 也体现了awk支持运算的特性
语法形式:
awk -F "[表达式]" '{print [内置变量]}' file
表达式:
任意字符
正则表达式
awk -F "[表达式]" '取行方式+取列方式' file
#BEGIN 是一个特殊的模式,它在处理任何输入行之前执行一次。
awk -F "[表达式]" 'BEGIN{print 任意内容}' file
#过滤文件的选择:/etc/passwd文件的前10行,存储到了~/passwd.txt中
#即:head /etc/passwd >> ~/passwd.txt
#在未明确说明分隔符时,默认指定分隔符为":"
1.指定取行
#取出文件最后一行
[root@Dezyan ~]# awk 'END{print}' passwd.txt
#取出第7行和第9行以及两行之间的内容
[root@Dezyan ~]# awk 'NR>=7&&NR<=9' passwd.txt
2.模糊取行
#取出文件中以root开头和以adm开头以及两行之间的内容
[root@Dezyan ~]# awk '/^root/,/^adm/' passwd.txt
3.字符比对取行
#取出文件中用户名为root的行
[root@Dezyan ~]# awk -F: '$1=="root"' passwd.txt
#取出文件中以nologin结尾的行
[root@Dezyan ~]# awk -F: '$NF~"nologin$"' passwd.txt
4.数字比对取行
#取出用户uid大于6的行
[root@Dezyan ~]# awk -F: '$3>6' passwd.txt
5.取列
#输出文件每一行最后一列的序号(以:或\或:\为分隔符)
[root@Dezyan ~]# awk -F "[:/]+" '{print NF}' passwd.txt
#输出文件的第一列和最后一列(以:或\或:\为分隔符)
[root@Dezyan ~]# awk -F "[:/]+" '{print $1,$NF}' passwd.txt
6.BEGIN用法示例
#在输出文件第一列内容前,先输出“用户名”
[root@Dezyan ~]# awk -F: 'BEGIN{print "用户名"}{print $1}' passwd.txt
#让输出的第一列内容前,都有“用户名:”几个字
[root@Dezyan ~]# awk -F: '{print "用户名:" $1}' passwd.txt
7.综合运用
#输出文件最后一行的最后一列
[root@Dezyan ~]# awk -F: 'END{print $NF}' passwd.txt
#输出大于第5行到结尾的内容,并取出第3列
[root@Dezyan ~]# awk -F: 'NR>5{print $3}' passwd.txt
#输出用户uid大于6的行并输出用户名
[root@Dezyan ~]# awk -F: '$3>6{print $1}' passwd.txt
#将系统重不能登录的用户输出到nologin.txt文件中,并在文件的开头显示“不能登录的用户有:”
##注:使用awk命令;不能使用管道符
[root@Dezyan ~/testdir]# awk -F: 'BEGIN{print "不能登录的用户有:"} $NF~"nologin$"{print $1}' /etc/passwd >> nologin.txt
不能登录的用户有:
bin
daemon
……………………