1. Grep
grep 是行过滤工具,用于根据关键字进行过滤
1.1. 语法和选项
1.1.1. 语法
grep [选项] '关键字' 文件名
1.1.2. 常见选项
OPTIONS:
-[v] 查找不包含指定内容的行,反向选择
-[n] 显示行号
-[i] 不区分大小写
-[w] 按单词搜索
-[o] 打印匹配字
-[c] 统计匹配到的次数
-[r] 逐层遍历目录查找
-[A] 显示匹配行及后面多少行
-[B] 显示匹配行及前面多少行
-[C] 显示匹配行及前面和后面多少行
1.2. 学习示例
示例数据 passwd
文件
# chen @ localhost in ~/Shell [16:33:50] C:1
$ cat -n passwd
1 root:x:0:0:root:/root:/bin/zshi
2 b:in:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 192.168.10.36
14
15
16 1.1.125
1.2.1. 匹配 passwd
文件中以 adm
开头的数据,同时显示行号并且不区分大小写
# chen @ localhost in ~/Shell [16:28:04]
$ grep -ni '^adm' passwd
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
1.2.2. 匹配 passwd
文件中以 nologin
结尾的数据,同时显示行号并且不区分大小写
# chen @ localhost in ~/Shell [16:28:29] C:1
$ grep -ni 'nologin$' passwd
2:b:in:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
2. Cut
cut
是列截取工具
2.1. 语法和选项
2.1.1. 语法
cut [选项] 文件名
2.1.2. 常见选项
OPTIONS:
-[c] 以字符为单位进行分割
-[d] 自定义分隔符,默认制表符\t
-[f] 与-d一起使用,指定截取哪个区域
2.2. 学习示例
2.2.1. passwd
文件以 :
分割数据,截取第一列内容
# chen @ localhost in ~/Shell [16:33:57]
$ cut -d: -f1 passwd
root
b
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
192.168.10.36
1.1.125
2.2.2. passwd
文件以 :
分割数据,截取第1,6,7列内容
# chen @ localhost in ~/Shell [16:41:58]
$ cut -d: -f1,6,7 passwd
root:/root:/bin/zshi
b:bin:/bin
daemon:/sbin:/sbin/nologin
adm:/var/adm:/sbin/nologin
lp:/var/spool/lpd:/sbin/nologin
sync:/sbin:/bin/sync
shutdown:/sbin:/sbin/shutdown
halt:/sbin:/sbin/halt
mail:/var/spool/mail:/sbin/nologin
operator:/root:/sbin/nologin
games:/usr/games:/sbin/nologin
ftp:/var/ftp:/sbin/nologin
192.168.10.36
1.1.125
2.2.3. 匹配 passwd
文件中每行第四个字符
# chen @ localhost in ~/Shell [16:43:11]
$ cut -c4 passwd
t
n
m
:
x
c
t
2.2.4. 匹配 passwd
文件中每行第4-10个字符
# chen @ localhost in ~/Shell [16:46:19]
$ cut -c4-10 passwd
t:x:0:0
n:x:1:1
mon:x:2
:x:3:4:
x:4:7:l
c:x:5:0
tdown:x
t:x:7:0
l:x:8:1
rator:x
es:x:12
:x:14:5
.168.10
.125
2.2.5. 从第5个字符开始截取后面所有的字符
# chen @ localhost in ~/Shell [16:47:52]
$ cut -c5- passwd
:x:0:0:root:/root:/bin/zshi
:x:1:1:bin:/bin:/sbin/nologin
on:x:2:2:daemon:/sbin:/sbin/nologin
x:3:4:adm:/var/adm:/sbin/nologin
:4:7:lp:/var/spool/lpd:/sbin/nologin
:x:5:0:sync:/sbin:/bin/sync
down:x:6:0:shutdown:/sbin:/sbin/shutdown
:x:7:0:halt:/sbin:/sbin/halt
:x:8:12:mail:/var/spool/mail:/sbin/nologin
ator:x:11:0:operator:/root:/sbin/nologin
s:x:12:100:games:/usr/games:/sbin/nologin
x:14:50:FTP User:/var/ftp:/sbin/nologin
168.10.36
125
3. Sort
sort 工具用于排序,它将文件的每一行作为一个单位,从首字母向后,依次按ASCII 码的值进行比较,最后将它们按升序输出
3.1. 语法和选项
3.1.1. 语法
sort [选项] 文件名
3.1.2. 常见选项
OPTIONS:
-[u] 去除重复行
-[r] 降序排列,默认是升序
-[o] 将排序结果输出到文件中,类似重定向符号
-[n] 以数字排序,默认是按字符排序
-[t] 分隔符
-[k] 第N列
-[b] 忽视前导空格
-[R] 随机排序,每次运行的结果均不同
3.2. 学习示例
3.2.1. 按用户的 uid 进行降序排列,并将结果重定向到 id.txt 文件
# chen @ localhost in ~/Shell [17:12:21]
$ sort -nr -t: -k3 passwd -o id.txt
# chen @ localhost in ~/Shell [17:12:34]
$ cat -n id.txt
1 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
2 sync:x:5:0:sync:/sbin:/bin/sync
3 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 daemon:x:2:2:daemon:/sbin:/sbin/nologin
6 root:x:0:0:root:/root:/bin/zshi
7 b:in:x:1:1:bin:/bin:/sbin/nologin
4. Uniq
uniq
用于去除连续的重复行
4.1. 语法和选项
4.1.1. 语法
uniq [选项] 文件名
4.1.2. 常见选项
OPTIONS:
-[i] 不区分大小写
-[c] 统计重复行次数
-[d] 只显示重复行
5. diff
diff 工具用于逐行比较文件的不同
注意: diff描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个文件匹配
4.1. 语法和选项
4.1.1. 语法
diff [选项] 文件1 文件2
4.1.2. 常用选项
OPTIONS:
-[b] 不检查空格
-[B] 不检查空白行
4.2. 显示
4.2.1. 正常显示
# chen @ localhost in ~/Shell [17:17:15]
$ cp ./passwd ./passwd2
# chen @ localhost in ~/Shell [17:26:50]
$ ls
11.txt id.txt passwd2 shell-master.zip
hostname passwd shell-master test.sh
# chen @ localhost in ~/Shell [17:27:02]
$ vim passwd2
# chen @ localhost in ~/Shell [17:27:25]
$ diff passwd passwd2
2,3c2,4 //第一个文件的第2,3行需要改变(c=change)才可以和第二个文件的第2到4行匹配
< b:in:x:1:1:bin:/bin:/sbin/nologin // '<' 表示第一个文件内容
< daemon:x:2:2:daemon:/sbin:/sbin/nologin
---
> b:aa
> in:x:1:1:bin:/bin:/sbin/nologin //'>' 表示右边文件内容
> ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
5d5 //第一个文件的第5行删除(d=delete)之后才能和第二个文件的第5行匹配
< lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4.2.2. 合并格式显示
# chen @ localhost in ~/Shell [17:45:54] C:1
$ diff -u passwd passwd2
// 前两行主要列出比较的文件名和文件时间戳;文件名前的---表示 passwd,+++表示passwd2
--- passwd 2019-12-24 17:09:12.168212667 +0800
+++ passwd2 2019-12-24 17:41:55.850849538 +0800
@@ -1,7 +1,7 @@
root:x:0:0:root:/root:/bin/zshi
-b:in:x:1:1:bin:/bin:/sbin/nologin
-daemon:x:2:2:daemon:/sbin:/sbin/nologin
+b:aa
+in:x:1:1:bin:/bin:/sbin/nologin
+ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
4.3. 比较两个目录不同
默认情况下也会比较两个目录里相同文件的内容
// 默认情况下也会比较两个目录相同文件的内容
# chen @ localhost in ~/Shell [10:28:11]
$ diff dir1 dir2
只在 dir1 存在:test1
diff dir1/test10 dir2/test10
4d3
<
只在 dir2 存在:test10
只在 dir2 存在:test12
只在 dir2 存在:test13
只在 dir2 存在:test14
// 如果只需要比较两个目录里文件的不同,不需要进一步比较文件内容不同,加-q选项
# chen @ localhost in ~/Shell [10:29:03] C:1
$ diff -q dir1 dir2
只在 dir1 存在:test1
文件 dir1/test10 和 dir2/test10 不同
只在 dir2 存在:test10
只在 dir2 存在:test12
只在 dir2 存在:test13
只在 dir2 存在:test14
4.4.使用技巧
有时候我们需要以一个文件为标准,去修改其他文件,并且修改的地方较多时,我们可以通过打补丁的方式完成
**注: **该示例是将文件 passwd
内容修改为 passwd2
内容
//首先找出文件不同输出到新文件
-u: 上下文模式
-N:将不存在的文件视为空文件
# chen @ localhost in ~/Shell [8:55:32]
$ diff -uN passwd passwd2 > passwd.patch
# chen @ localhost in ~/Shell [8:57:44]
$ patch passwd passwd.patch //将不同内容打补丁到文件
patching file passwd
// 测试验证
# chen @ localhost in ~/Shell [8:58:20]
$ diff passwd passwd2
6. Paste
Linux paste 命令用于合并文件的列。
paste 指令会把每个文件以列对列的方式,一列列地加以合并。
6.1. 语法和选项
6.1.1. 语法
paste [OPTION]... [FILE]...
6.1.2. 常用选项
OPTIONS:
-[d] 用指定的间隔字符取代跳格字符。
-[s] 串行而非并行处理
6.2. 学习示例
合并文件file1、file2 、file3
# chen @ localhost in ~/Shell [10:20:21]
$ cat -n file1
1 name
2
3 chen
4 deng
5 hello
# chen @ localhost in ~/Shell [10:20:25]
$ cat -n file2
1 address
2
3 shanxi
4 beijing
5 shanghai
# chen @ localhost in ~/Shell [10:20:42]
$ cat -n file3
1 age
2
3 13
4 15
5 16
# chen @ localhost in ~/Shell [10:19:37]
$ paste file1 file2 file3
name address age
chen shanxi 13
deng beijing 15
hello shanghai 16
7. tr
tr
用于字符转换、替换和删除;主要用于删除文件中控制字符或进行字符转换
7.1. 语法和选项
7.1.1. 语法
// 用法1: 命令的执行结果交给 tr 处理.其中 str1 用于查询,str2 用于转换处理
$ command | tr 'str1' 'str2'
// 用法2:tr 处理的内容来自文件, 使用"<" 标准输入
$ tr 'str1' 'str2' < filename
// 用法3:匹配 str1 进行相应的操作,如删除操作
$ tr [option] 'str1' < filename
7.1.2. 常用选项
OPTIONS:
- [d] 删除字符串1中所有输入字符
- [s] 删除所有重复出现字符序列,只保留第一个;即将重复出现的字符串压缩为一个字符串
7.1.3. 常匹配字符串
- a-z或[:lower:] 匹配所有小写字母
- A-Z或[:upper:] 匹配所有大写字母
- 0-9或[:digit:] 匹配所有数字
- [:alnum:] 匹配所有数字
- [:alpha:] 匹配所有字母
- [:blank:] 匹配所有水平空白
- [:punct:] 匹配所有标点符号
7.2. 学习示例
7.2.1 删除 passwd 文件中所有小写字母
# chen @ localhost in ~/Shell [9:46:01]
$ tr -d 'a-z' < passwd
::0:0::/://
:
::1:1::/://
::2:2::/://
::3:4:://://
::5:0::/://
::6:0::/://
8. tee
tee 工具是从标准输入读取并写入到标准输出和文件,即:双向覆盖重定向(屏幕输出|文本输入)
命令tee与重定向的区别
重定向:读取的内容输出到指定文件中,在屏幕上并不显示
tee:在屏幕上显示的同时,将读取的内容也重定向到指定文件中
8.1. 语法和选项
8.1.1. 语法
tee [OPTION]... [FILE]...
8.1.2. 选项
-[a],将读取的内容追加到文件的后面(默认是覆盖)
9. 学习案例
9.1. 利用上面 8 个文本处理小工具获取 linux 主机 ipnet、 netmask、 broadcast,并且分行显示
# chen @ localhost in ~/Shell [9:54:12] C:1
$ ifconfig eth0 | grep broadcast
inet 192.168.10.36 netmask 255.255.255.0 broadcast 192.168.10.255
# chen @ localhost in ~/Shell [9:54:20]
$ ifconfig eth0 | grep broadcast | tr -d 'a-zA-Z'
192.168.10.36 255.255.255.0 192.168.10.255
# chen @ localhost in ~/Shell [9:55:57]
$ ifconfig eth0 | grep broadcast | tr -d 'a-zA-Z:' | tr ' ' '\n'
192.168.10.36
255.255.255.0
192.168.10.255
# chen @ localhost in ~/Shell [9:56:12]
$ ifconfig eth0 | grep broadcast | tr -d 'a-zA-Z:' | tr ' ' '\n' | grep -v '^$'
192.168.10.36
255.255.255.0
192.168.10.255
9.2. 将系统中所有普通用户的用户名、家目录和默认 shell 保存到一个文件中,要求用户名和默认密码 shell 之间用 tab 分割
# chen @ localhost in ~/Shell [10:04:59] C:1
$ grep 'zsh$' /etc/passwd
root:x:0:0:root:/root:/bin/zsh
chen:x:1000:1000:chen:/home/chen:/bin/zsh
# chen @ localhost in ~/Shell [10:05:06]
$ grep 'zsh$' /etc/passwd | grep -v '^root'
chen:x:1000:1000:chen:/home/chen:/bin/zsh
# chen @ localhost in ~/Shell [10:05:39]
$ grep 'zsh$' /etc/passwd | grep -v '^root' | cut -d: -f1,6,7
chen:/home/chen:/bin/zsh
# chen @ localhost in ~/Shell [10:06:27]
$ grep 'zsh$' /etc/passwd | grep -v '^root' | cut -d: -f1,6,7 | tr ':' '\t'
chen /home/chen /bin/zsh
# chen @ localhost in ~/Shell [10:07:16]
$ grep 'zsh$' /etc/passwd | grep -v '^root' | cut -d: -f1,6,7 | tr ':' '\t' | tee users.txt
chen /home/chen /bin/zsh
# chen @ localhost in ~/Shell [10:07:43]
$ cat users.txt
chen /home/chen /bin/zsh