grep + awk
- 1.grep命令
- 1.1 基本格式
- 1.2 常用选项
- 2.awk命令
- 2.1 awk工作原理
- 2.2 awk命令格式
- 2.3 awk常用内置变量
1.grep命令
1.1 基本格式
grep [选项]… 查找条件 目标文件
1.2 常用选项
选项 | 功能 |
---|---|
-m [ x ] | 匹配x次 后停止,x为具体数字 |
-v | 取反 |
-i | 忽略字符大小写 |
-n | 显示匹配的 行号 |
-c | 统计匹配的行数 |
-o | 仅显示匹配到的字符串 |
-q | 静默模式,不输出任何信息 |
-A x after | 匹配内容的后x行 |
-B x before | 前x行 |
-C x context | 前后各x行 |
-e | 实现多个选项间的逻辑or关系 |
-w | 匹配 整个单词 |
-E | 使用扩展正则表达式,相当于egrep |
-F | 不支持正则表达式,相当于fgrep |
-r | 递归目录,但不处理软链接 |
-R | 递归目录,但处理软链接 |
-f file | file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件 |
-color=auto | 对匹配到的文本着色显示 |
-m 匹配#次后停止
grep -m 1 root /etc/passwd #多个匹配只取第一个
-v 取反
grep -Ev '^[[:space:]]*#|^$' /etc/fstab#非空行
-c 统计匹配的行数
grep -c root /etc/passwd #统计匹配到的行数
-A x after 匹配内容的后x行
grep -A3 root /etc/passwd #匹配到的行后3行业显示出来
-e 实现多个选项间的逻辑or关系
grep -e root -e bash /etc/passwd #包含root或者包含bash 的行
grep -E root|bash /etc/passwd #使用扩展正则表达式的写法
-w 匹配整个单词
grep -w root /etc/passwd
2.awk命令
2.1 awk工作原理
+-----------------+
| 输入文件 |
| 或标准输入 |
+-----------------+
|
v
+-----------------+
| 分割输入行 |
+-----------------+
|
v
+-----------------+
| 匹配模式 |
+-----------------+
|
v
+-----------------+
| 执行动作 |
+-----------------+
|
v
+-----------------+
| 处理下一行 |
+-----------------+
|
v
循环结束
-
读取输入:AWK首先读取输入文件或从标准输入接收输入;
-
分割输入:AWK默认将输入行分割成字段,并使用空格或制表符作为字段分隔符;
-
匹配模式:AWK使用模式匹配来确定需要处理的行,可以使用正则表达式或其他条件来指定匹配的行。如果没有指定模式,AWK将默认匹配所有行;
-
执行动作:当输入行与模式匹配时,AWK执行相应的动作;
-
处理下一行:一旦完成当前行的处理,AWK继续处理下一行,重复上述步骤。
2.2 awk命令格式
awk默认使用正则表达式 所以不需要\
#命令格式#
awk [选项] '[模式匹配条件]{操作 }' 文件1 文件2..
#选项#
#一般只有-F常用
-F 指定分隔符,默认的分隔符是若干个连续空白符,默认的时候可不写
-v 自定义变量
-f 脚本
awk '/匹配条件/{ print $x }'
#匹配条件可以不写 x为任意数字
#模式匹配条件格式#
/ 匹配条件 /
# 起始 结束
#/ / 一定要加
#操作#
#常用的 只有 print
awk '{ print $1 }'
awk '{ print $1 $2 $3 .... }'
#awk会自动压缩空格,不需要再写tr -s ' '
2.3 awk常用内置变量
内置变量 | 功能 |
---|---|
FS | 指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v “FS=:” |
OFS | 输出时的分隔符 |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号(序数) |
$0 | 当前处理的行的整行内容 |
$n | 当前处理行的第n个字段(第n列) |
FILENAME | 被处理的文件名 |
RS | 行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n |
########### FS #################
[root@localhost ky15]#awk -v FS=':' '{print $1FS$3}' /etc/passwd
#此处FS 相当于于变量 -v 变量赋值 相当于 指定: 为分隔符
[root@localhost ky15]#awk -F: '{print $1":"$3}' /etc/passwd
shell中的变量
[root@localhost ky15]#fs=":";awk -v FS=$fs '{print $1FS$3}' /etc/passwd
#定义变量传给FS
######### 支持变量 ##################
[root@localhost ky15]#fs=":";awk -v FS=$fs -v OFS="+" '{print $1,$3}' /etc/passwd
#输出分隔符
-F -FS一起使用 -F 的优先级高
############ OFS ##########
[root@localhost ~]#awk -v FS=':' -v OFS='==' '{print $1,$3}' /etc/passwd
root==0
bin==1
daemon==2
adm==3
lp==4
sync==5
######## RS #######
默认是已 /n (换行符)为一条记录的分隔符
不动他
[root@localhost ~]#echo $PATH | awk -v RS=':' '{print $0}'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin
################## NF ###################
代表字段的个数
[root@localhost ky15]#awk -F: '{print NF}' /etc/passwd
[root@localhost ky15]#awk -F: '{print $NF}' /etc/passwd
#$NF最后一个字段
[root@localhost ky15]#df|awk -F: '{print $(NF-1)}'
#倒数第二行
[root@localhost ky15]#df|awk -F "[ %]+" '{print $(NF-1)}'
################ NR ######################
行号
[root@localhost ky15]#awk '{print $1,NR}' /etc/passwd
##行号
[root@localhost ky15]#awk 'NR==2{print $1}' /etc/passwd
#只取第二行的第一个字段
[root@localhost ky15]#awk 'NR==1,NR==3{print}' passwd
#打印出1到3 行
[root@localhost ky15]#awk 'NR==1||NR==3{print}' passwd
#打印出1和3行
[root@localhost ky15]#awk '(NR%2)==0{print NR}' passwd
#打印出函数取余数为0行
[root@localhost ky15]#awk '(NR%2)==1{print NR}' passwd
#打印出函数取余数为1的行
[root@localhost ky15]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd
[root@localhost ky15]#seq 10|awk 'NR>5 && NR<10'
#取 行间
6
7
8
9
[root@localhost ky15]#awk '$3>1000{print}' /etc/passwd
#注意分隔符
#打印出普通用户 第三列 大于1000 的行
################ FNR ############
[root@localhost data]#cat /etc/issue |wc -l
3
[root@localhost data]#cat /etc/os-release |wc -l
16
[root@localhost data]#awk '{print FNR}' /etc/issue /etc/os-release
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
################ FILENAME ############
[root@localhost ~]#awk -F: 'NR==2{print FILENAME}' /etc/passwd
/etc/passwd