Linux文本三剑客

1 grep — 以行输出

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
演示文本:
/etc/passwd

- 搜索文本内容

grep命令是我们常用的一个强大的文本搜索命令。
命令格式:
grep [参数] [关键字] <文件名>
注意:
可以通过 grep --help 查看grep的帮助信息
参数详解:
-c 只输出匹配关键字的计数
-n 显示匹配行内容及行号
-v 显示不包含匹配文本的所有行
-o 只列出所匹配关键字
-i 忽略大小写
-A/B/C 后几行信息/前几行信息/前后几行信息
-E 启用正则表达式

案例:
grep "root" /etc/passwd //筛选有关root的相关信息
grep -c "Failed" /var/log/secure //筛选是否存在大量的登录失败日志信息并计数
grep -n "Failed" secure //显示行号
grep -i "Failed" /var/log/secure //忽略大小筛选Failed相关信息
grep -C 5 "Failed" /var/log/secure //筛选Failed前后5信息
grep -v "^#" /etc/sudoers //查询以#开头以外的信息
grep -v "^$" /etc/sudoers //查询以空行以外的信息
grep -v "^#" /etc/sudoers | grep -v "^$" //查询空行和注释行以外的信息
grep -v "^#\|^$" /etc/sudoers
grep -Ev "^#|^$" /etc/sudoers
- ^ 以....开头
- $ 以....结尾
- \ 转义符 --- 让符合功能失效/让字符所对应的功能生效
- ^$ 空行

2 sed — 编辑

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
50
51
52
53
54
55
56
57
58
59
演示文本:
hello sed1 sed1 sed1
hello sed2 sed2 sed2
hello sed3 sed3 sed3
hello sed4 sed4 sed4
hello sed5 sed5 sed5
hello sed6 sed6 sed6
hello sed7 sed7 sed7
hello sed8 sed8 sed8

sed 行文件编辑工具。因为它编辑文件是以行为单位的。
命令格式:
sed [参数] '<匹配条件> [动作]' [文件名]
注意:
可以通过 sed --help 查看帮助信息
参数详解:
参数为空 表示sed的操作效果,实际上不对文件进行编辑
-n 取消静默输出
-i 表示对文件进行编辑
匹配条件:
匹配条件分为两种:数字行号或者关键字匹配
关键字匹配格式:
‘/关键字/’
动作详解:
a 在匹配到的内容下一行增加内容
i 在匹配到的内容当前行增加内容
d 删除匹配到的内容
s 替换匹配到的内容
p 查看指定内容
e 多点编辑


+ 查看
sed -n '/root/p' /etc/passwd //查看包含root的信息
sed -n '/^root/p' /etc/passwd //查看以root开头的信息
sed -n '1p' sed.txt //查看第一行信息

+ 删除
sed -i '3d' sed.txt //删除第三行
sed -i '3d;6d' sed.txt //删除第三行和第六行
sed -i '1,5d' sed.txt //删除第一行到第五行
sed -i '/sed4/d' sed.txt //删除包含sed4的行内容

+ 替换
sed -i 's/匹配内容/替换内容/g' 文件名
sed -i 's#匹配内容#替换内容#g' 文件名
- s 行 g 匹配到的第几个数量

sed -i 's/sed/SED/g' sed.txt //所有的sed替换为SED
sed -i 's/SED/sed/' sed.txt //将每一行的首个SED替换为sed
sed -i 's/SED/sed/2' sed.txt //将每一行的第2个SED替换为sed
sed -i '5s/SED/sed/' sed.txt //将第5行的第1个SED替换为sed
sed -i 's/HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile //修改历史命令为10000


+ 增加
sed -i '1a\add-1' sed.txt //在第1行后增加
sed -i '3i\insert-1' sed.txt //在第3行前增加
sed -i '/^root/a\gjq ALL=(ALL) ALL' /etc/sudoers //给gjq用户增加sudo权限

3 awk — 不仅仅行输出,还可以列输出

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
50
51
52
53
54
55
56
57
58
59
演示文本:
hello awk1 awk2 awk3
hello awk4 awk5 awk6
Hello awk7 awk8 awk9

命令格式
awk [参数] '[ 动作]' [文件名]
常见参数:
-F 指定列的分隔符
-f 调用脚本
-v 定义变量
常见动作:
print 显示内容
$0 显示当前行所有内容
$n 显示当前行的第n列内容
动作组成
BEGIN{ 命令 } 初始代码块,主要和变量相关
/pattern/{ 命令 } 匹配、执行代码块
END{ 命令 } 结束代码块,主要和信息输出相关
内置变量
FILENAME 当前输入文件的文件名,该变量是只读的
NR 指定显示行的行号
NF 输出当前行的列数
OFS 输出格式的列分隔符,缺省是空格
FS 输入文件的列分融符,缺省是连续的空格和Tab

例子:
awk '/hello/' awk.txt //查看包含hello的行内容
awk '{print $2}' awk.txt //查看第2列内容
awk '/Hello/{print $3}' awk.txt //查看包含Hello的第3列内容
awk '{print NR,$3}' awk.txt //查看第3列内容并显示行号
awk 'NR==2{print $3}' awk.txt //查看第2行的第3列内容
awk 'NR==2{print substr($3,4,1)}' awk.txt //查看第2行的第3列中的5数字
- substr(内容,起始位置,数量) --- 截取
+ 综上所运用的方法都是基于 默认以 空格 作为分隔符


awk -F ',' '{print $2}' awk.txt //以,作为分隔符输出第2列的内容
awk -F ',' 'BEGIN{OFS="-----"}{print NR,$3}' awk.txt //设置显示分隔符为-----

ll | awk '{if ($5>=1910) print "\n" "filename:" $9 "\n" "lenth:" $5 "B" "\n"}'
filename:initial-setup-ks.cfg
lenth:1949B
#输出当前目录下文件大小大于1910的文件名和文件大小

ll | awk '{if ($5>=1910 && /^-/) print "\n" "filename:" $9 "\n" "lenth:" $5 "B" "\n"}'
filename:initial-setup-ks.cfg
lenth:1949B
#输出当前目录下普通文件大小大于1910的文件名和文件大小


+ 查询UID为0的用户/GID为10的组
awk -F ':' '$3==0{print $1}' /etc/passwd
awk -F ':' '$3==10{print $0}' /etc/group

+ 查询空密码的用户
awk -F ':' '$2 == "" {print $1}' /etc/shadow
awk -F ':' 'length($2)==0{print $1}' /etc/shadow