一个程序从运行到消亡,它这一生总共就干了三件事情——数据接收、数据处理和数据输出。大部分的Linux指令都是由命令、选项和参数构成,参数是于用户交互的入口,也是保证程序能够正常运行的关键。

GREP

grep(Globally search a Regular Expression and Print)是一个强大的文本搜索工具,可以根据制定模式来匹配并输出符合要求的字符串。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
grep [options] pattern [files]

grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
pattern - 表示要查找的字符串或正则表达式。
files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。
常用选项::
-i:忽略大小写进行匹配。
-v:反向查找,只打印不匹配的行。
-n:显示匹配行的行号。
-r:递归查找子目录中的文件。
-l:只打印匹配的文件名。
-c:只打印匹配的行数。
更多参数说明:
-a 或 --text : 不要忽略二进制的数据。
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c 或 --count : 计算符合样式的列数。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i 或 --ignore-case : 忽略字符大小写的差别。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-q 或 --quiet或--silent : 不显示任何信息。
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-s 或 --no-messages : 不显示错误信息。
-v 或 --invert-match : 显示不包含匹配文本的所有行。
-V 或 --version : 显示版本信息。
-w 或 --word-regexp : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定"-i"参数相同。

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 统计单个文件匹配行数
# 查询本机有几个CPU
[sujx@LEGION:~]$ grep -c processor /proc/cpuinfo
8

# 匹配多个文件,查询以root开头的文件行数
[sujx@LEGION:~]$ grep -c ^root /etc/passwd*
/etc/passwd:1
/etc/passwd-:1

# 查询文件忽略大小写
[sujx@LEGION:~]$ grep -i port /etc/ssh/ssh_config
# Port 22
[sujx@LEGION:~]$ grep -i ^port /etc/ssh/ssh_config
[sujx@LEGION:~]$

# 查询文本中指定搜索条件的行号
[sujx@LEGION:~]$ grep -n -i port /etc/ssh/ssh_config
38:# Port 22

# 使用-q表示静默模式
[root@docker ~]# lsmod |grep hv_
hv_balloon 49152 0
hv_utils 61440 3
hv_storvsc 32768 3
scsi_transport_fc 110592 1 hv_storvsc
hv_netvsc 126976 0
hv_vmbus 184320 7 hv_balloon,hv_utils,hv_netvsc,hid_hyperv,hv_storvsc,hyperv_keyboard,hyperv_drm
[root@docker ~]# lsmod |grep hv_ -q
# 返回值为0说明有匹配对象,不输出具体表现
[root@docker ~]# echo $?
0

# 递归查询
[root@docker ~]# grep -r ^root /etc/*
/etc/cockpit/disallowed-users:root
/etc/group:root:x:0:
/etc/group-:root:x:0:
/etc/gshadow:root:::
/etc/gshadow-:root:::
/etc/kernel/cmdline:root=/dev/mapper/rl-root ro resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd-:root:x:0:0:root:/root:/bin/bash
/etc/pki/ca-trust/extracted/README:root CA certificates.
/etc/pki/ca-trust/extracted/java/README:root CA certificates.
/etc/pki/ca-trust/extracted/openssl/README:root CA certificates.
/etc/pki/ca-trust/extracted/pem/README:root CA certificates.
/etc/security/limits.conf:root hard nofile 64000
/etc/security/limits.conf:root soft nofile 64000

SED

SED(Stream Editor),贝尔实验室在1973年开发的流编辑器。在SED中,搞清楚你需要编辑的是哪一行内容。sed可以实现批量文本的替换、插入、修改和删除等操作。sed会逐行扫描输入的数据,并将读取的数据内容复制到缓冲区中,然后拿模式空间中的数据与给定的条件进行匹配,如果匹配成功则执行特定的sed指令,否则sed会跳过输入的数据行,继续读取后续的数据。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 创建示例
[sujx@docker ~]$ cat text
bird work good seak
mark bird bird rest
push deep bird bush
desk jeep need year
beat meet seat bird

# 显示,不加-n参数,sed会输出两遍,因为sed本身会输出一遍
[sujx@docker ~]$ sed 'p' text
bird work good seak
bird work good seak
mark bird bird rest
mark bird bird rest
push deep bird bush
push deep bird bush
desk jeep need year
desk jeep need year
beat meet seat bird
beat meet seat bird
[sujx@docker ~]$ sed -n 'p' text
bird work good seak
mark bird bird rest
push deep bird bush
desk jeep need year
beat meet seat bird
# 显示第二行
[sujx@docker ~]$ sed -n '2p' text
mark bird bird rest
# 显示第1、3、5行文本
[sujx@docker ~]$ sed -n "1p;3p;5p" text
bird work good seak
push deep bird bush
beat meet seat bird
# 从第二行开始,按偶数步长进行显示
[sujx@docker ~]$ sed -n '2~2p' text
mark bird bird rest
desk jeep need year
# 从管道中欧给选择输出第五行
[sujx@docker ~]$ df -h |sed -n '5p'
/dev/mapper/rl-root 35G 3.3G 32G 10% /
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 替换,不加-i参数,不会保存修改结果。
# 生产环境中的最佳实践是先不使用-i 选项测试 sed 指令是否正确,确认无误后再使用-i 选项修改源文件,或者对源文件进行备份操作。
# 将含有work的一行的第一个bird替换为cat
[sujx@docker ~]$ sed "/work/s/bird/cat/" text
cat work good seak
mark bird bird rest
push deep bird bush
desk jeep need year
beat meet seat bird
[sujx@docker ~]$ cat text
bird work good seak
# 将1到3行的bird全部替换为cat
[sujx@docker ~]$ sed "1,3s/bird/cat/g" text
cat work good seak
mark cat cat rest
push deep cat bush
desk jeep need year
beat meet seat bird
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 插入、修改和删除
# 在第三行上插入一行cat dog snake horse
[sujx@docker ~]$ sed "3i\cat dog snake horse" text
bird work good seak
mark bird bird rest
cat dog snake horse
push deep bird bush
desk jeep need year
beat meet seat bird
# 在第三行下插入一行cat dog snake horse
[sujx@docker ~]$ sed "3a\cat dog snake horse" text
bird work good seak
mark bird bird rest
push deep bird bush
cat dog snake horse
desk jeep need year
beat meet seat bird
# 把第三行替换为worm worm worm
[sujx@docker ~]$ sed "3c\worm worm worm worm" text
bird work good seak
mark bird bird rest
worm worm worm worm
desk jeep need year
beat meet seat bird

AWK

AWk是Linux平台功能最强大的数据处理引擎,提供了模式匹配、数学运算、流程控制、内置变量和函数等功能,它不仅仅是一个文本处理工具,同时也是一门程序设计语言。尽管AWK语句包含Begin\END和中间三部分。begin部分勇于变量的初始化和赋值,End部分用于输出结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 统计数量
# 输出所有包含bird的行
[sujx@docker ~]$ awk /bird/ ./text
bird work good seak
mark bird bird rest
push deep bird bush
beat meet seat bird
# 统计有多少行包含bird
[sujx@docker ~]$ awk '/bird/{n++} END {print n}' ./text
4
# 输出第三行
[sujx@docker ~]$ cat text | awk '{if(NR==3) print $0}'
push deep bird bush