在Linux系统中,我们经常需要使用各种文本处理工具来处理各种文本信息,熟悉掌握这些使用的小工具,能极大的提高工作效率。
常用的文本处理工具有以下这些:
cat命令
cat命令的主要功能是将一个或多个文件或者标准输入连接,并输出至标准输出。通常用来查看文本文件内容。
选项 | 说明 |
---|---|
-A, --show-all | 等价于 -vET |
-b, --number-nonblank | 对非空输出行编号 |
-e | 等价于 -vE |
-E, --show-ends | 在每行结束处显示 $ |
-n, --number | 对输出的所有行编号 |
-s, --squeeze-blank | 不输出多行空行 |
-t | 与 -vT 等价 |
-T, --show-tabs | 将跳格字符显示为 ^I |
-u | (被忽略) |
-v, --show-nonprinting | 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外 |
--help | 显示此帮助信息并退出 |
--version | 输出版本信息并退出 |
要注意的是:如果[文件]缺省,或者[文件]为 - ,则读取标准输入。
[root@localhost data]# cat <test.txt
> 123
> 456
> EOF
[root@localhost data]# cat test.txt
123
456
[root@localhost data]# cat -n test.txt #显示行号
1 123
2 456
[root@localhost data]# cat - #缺省时,读取标准输入
sss #标准输入
sss #读取内容
[root@localhost data]# cat /dev/null >test.txt #/dev/null 是一个空文件,利用它可以实现清空效果
tac命令
tac命令,即cat命令反过来写的,功能也类似,是按照行的倒序输出文本信息。
rev命令
rev命令,将每一行的前后内容倒序输出。
[root@localhost data]# cat test.txt
123
456
[root@localhost data]# tac test.txt
456
123
[root@localhost data]# rev test.txt
321
654
more和less命令
more命令可以分页查看文件文件,左下角会显示当前显示距离文末的百分比,通过空格键可以每次向下翻一页,b键向上翻一页,回车键每次向下翻一行。按q键可以退出。翻到最后一行时,会自动退出more命令。
相比于more命令,less命令执行后,默认不会退出,直到用户执行退出命令。less命令的基本功能与more类似,空格键向下翻页,b键向上翻页,上下箭头上移或下移一行,使用g/G可将光标切换到文件首页/尾页,输入/string回车后,可以向下进行搜索string对应的字符串,?string可以实现向上查找功能,配合n和N可以跳到下一个 或 上一个匹配。less 命令是man命令使用的分页器。
[root@localhost data]# ls /etc/ | less #more和less经常配合管道符一起使用
head和tail命令
head命令常用选项说明:
选项 | 说明 |
---|---|
-c, --bytes=[-]K | 显示每个文件的前K 字节内容 ;如果附加"-"参数,则除了每个文件的最后K字节数据外显示剩余全部内容 |
-n, --lines=[-]K | 显示每个文件的前K 行内容;如果附加"-"参数,则除了每个文件的最后K 行外显示剩余全部内容 |
-q, --quiet, --silent | 不显示包含给定文件名的文件头 |
-v, --verbose | 总是显示包含给定文件名的文件头 |
--help | 显示此帮助信息并退出 |
--version | 显示版本信息并退出 |
[root@localhost data]# head /etc/passwd #不带任何选项,默认输出前10行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
....省略以下内容
[root@localhost data]# head -c 6 /etc/passwd #显示前6个字节的内容
root:x
[root@localhost data]# head -c -6 /etc/passwd #加-表示,显示除了最后6个字节的所有内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
....省略以下内容
[root@localhost data]# head -n 6 /etc/passwd #显示前6行内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
....省略一下内容
[root@localhost data]# head -n -6 /etc/passwd #显示除了最后6行之外的全部内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
....省略一下内容
tail命令常用选项说明:
选项 | 说明 |
---|---|
--retry | 即使tail开始时就不能访问 或者在tail运行后不能访问,也仍然不停地尝试打开文件. -- 只与-f合用时有用. |
-c, --bytes=N | 输出最后N个字节 |
-f | 当文件增长时,输出后续添加的数据; -f, --follow以及 --follow=descriptor 都是相同的意思,常用于日志监控 |
-n, --lines=N | 输出最后N行,而非默认的最后10行 |
--max-unchanged-stats=N | 参看texinfo文档(默认为5) |
--max-consecutive-size-changes=N | 参看texinfo文档(默认为200) |
--pid=PID | 与-f合用,表示在进程ID,PID死掉之后结束. |
-q, --quiet, --silent | 从不输出给出文件名的首部 |
-s, --sleep-interval=S | 与-f合用,表示在每次反复的间隔休眠S秒 |
-v, --verbose | 总是输出给出文件名的首部 |
--help | 显示帮助信息后退出 |
--version | 输出版本信息后退出 |
[root@localhost data]# tail -n 7 /etc/passwd #显示最后7行内容
wufujie:x:1000:1000:myself,home,2013007,3454324:/home/wufujie:/bin/bash
test1:x:1001:1001::/home/test1:/bin/bash
[root@localhost data]# tail -n +7 /etc/passwd #有+时,表示显示除了前7行之外的所有内容,与head命令的 - 类似
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost data]# ping www.baidu.com >ping.log #ping百度的网址
[root@localhost ~]# tail -f /data/ping.log #再打开新的终端查看文件内容,一直在更新 tail命令不会自动退出
PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data.
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=1 ttl=128 time=11.2 ms
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=2 ttl=128 time=11.5 ms
....省略一下内容
[root@localhost ~]# tailf /data/ping.log #tailf命令与tail -f类似,不过可以退出
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=45 ttl=128 time=9.33 ms
tailf: cannot open /data/ping.log: No such file or directory #在另一个终端窗口删除ping.log文件后,会直接退出
wc命令
wc命令可以统计文件和标准输入的文本的行数,单词数,字节数和字符数。
wc命令常用选项说明:
选项 | 说明 |
---|---|
-c, --bytes | 打印字节数 |
-m, --chars | 打印字符数 |
-l, --lines | 打印行数 |
-L, --max-line-length | 打印最长行的长度 |
-w, --words | 打印单词数 |
[root@localhost data]# wc /etc/passwd #统计行数,单词数,字节总数
50 96 2582 /etc/passwd
[root@localhost data]# wc -l /etc/passwd
50 /etc/passwd
[root@localhost data]# wc -w /etc/passwd
96 /etc/passwd
[root@localhost data]# wc -m /etc/passwd
2582 /etc/passwd
[root@localhost data]# wc -c /etc/passwd
2582 /etc/passwd
[root@localhost data]# wc -L /etc/passwd
99 /etc/passwd
[root@localhost data]# who | wc -l #与管道符连接使用
2
cut和paste命令
cut命令的作用是以指定的分隔符对文件或标准输入的每行的内容进行切割,然后将切割的内容按顺序编号,最后将指定标号的所有内容逐行输出到标准输出,默认的分隔符为TAB。
cut命令常用选项说明:
选项 | 说明 |
---|---|
-b, --bytes=LIST | 输出这些字节 ,仅显示行中指定以字节为单位的范围的内容 |
-c, --characters=LIST | 输出这些字符 ,仅显示行中指定以字符为单位的范围的内容 |
-d, --delimiter=DELIM | 使用DELIM取代TAB做字段(field) 分隔符 ,默认的分隔符为TAB |
-f, --fields=LIST | 显示指定字段的内容 |
-n | (忽略) 与-b选项连用,不分割多字节字符,如汉字 |
-s, --only-delimited | 不显示没有分隔符的行 |
--output-delimiter=<字段分割符> | 指定输出内容的是字段分隔符 |
--help | 显示帮助信息,然后结束 |
--version | 显示版本信息,然后结束 |
使用且只使用-b,-c或-f中的一个选项. LIST由一个范围(range)或逗号隔开的多个范围组成.范围是下列形式之一:
N: 第N个字节, 字符或字段, 从1计数起
N-: 从第N个字节, 字符或字段直至行尾
N-M: 从第N到第M(并包括第M)个字节, 字符或字段
-M: 从第1到第M(并包括第M)个字节, 字符或字段
[root@localhost data]# echo 吃饭了吗 >test.txt
[root@localhost data]# cat test.txt
吃饭了吗
[root@localhost data]# cut -b -2 test.txt
[root@localhost data]# cut -b -3 test.txt
吃
[root@localhost data]# cut -nb -3 test.txt # -nb连用,不分割多字节字符
吃饭了
[root@localhost data]# cat test.txt
1 2 3
4 5 6
7 8 9
[root@localhost data]# cat test.txt | tr " " :|cut -d: -f2 #用:代替空格作为分隔符,并用cut命令取出第二列内容
2
5
8
[root@localhost data]# cat test.txt | tr " " :|cut -d: --complement -f2 #--complement 取反
1:3
4:6
7:9
paste命令可以将两个文件合并为一个文件,默认以行作为单位,文件中相同行的内容合并为一行。
[root@localhost data]# cat test.txt
1 2 3
4 5 6
7 8 9
[root@localhost data]# cat test2.txt
k l m
a b c
d e f
g h i
[root@localhost data]# paste test.txt test2.txt
1 2 3 k l m
4 5 6 a b c
7 8 9 d e f
g h i
[root@localhost data]# paste -d"#" test.txt test2.txt # -d:指定两个文件的分割字符串
1 2 3#k l m
4 5 6#a b c
7 8 9#d e f
#g h i
[root@localhost data]# paste -s test.txt test2.txt # -s:先将文件内容合并为一行,在进行合并
1 2 3 4 5 6 7 8 9
k l m a b c d e f g h i
sort和uniq命令
sort命令可以按照一定的要求对文件所有的行进行排序,默认按照字母表顺序排序,数字在字母前面。
sort命令常用选项说明:
短参数 | 长参数 | 说明 |
---|---|---|
-n | – number-sort | 按字符串数值排序,与-g区别为不转为浮点数 |
-g | –general-number-sort | 按通用数值排序,支持科学计数法 |
-f | –ignore-case | 忽略大小写,默认大小写字母不同 |
-k | –key=POS1[,POS2] | 排序从POS1开始,若指定POS2,则POS2结束,否则以POS1排序 |
-t | –field-separator=SEP | 指定列的分割符 |
-r | –reverse | 降序排序,默认为升序 |
-h | –human-numeric-sort | 使用易读性数字(例如: 2K 1G) |
-u | –unique | 去除重复的行 |
-o | –output=FILE | 将输出写入文件 |
[root@localhost data]# cat test.txt [root@localhost data]# sort test.txt
Avs 2vr #排序之后对比
SDV 7vf
2vr abc
swe ade
7vf Avs
ade SDV
abc swe
[root@localhost data]# sort -t: -k 3 /etc/passwd | head -n 3 #以:为分隔符,对第三列按字母顺序排序
root:x:0:0:root:/root:/bin/bash
wufujie:x:1000:1000:myself,home,2013007,3454324:/home/wufujie:/bin/bash
test1:x:1001:1001::/home/test1:/bin/bash
[root@localhost data]# sort -t: -k 3 -nr /etc/passwd | head -n 3 #以:为分隔符,对第三列按数字大小倒序排序
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
wfj1:x:2005:2005::/home/wfj1:/bin/bash
wfj:x:2004:2004::/home/wfj:/bin/bash
[root@localhost data]# sort -R test2.txt # -R 表示随机排序
[root@localhost data]# cut -d: -f7 /etc/passwd | sort -u # -u:排除相同的行,去重。
/bin/bash
/bin/sync
/bin/tcsh
/sbin/halt
/sbin/nologin
/sbin/shutdown
uniq命令
uniq命令可以对指定的文件生成报告信息和去重相邻行重复行的内容。
要注意的是:uniq 不会检查重复的行,除非它们是相邻的行。如果您想先对输入排序,使用没有uniq 的"sort -u"。
uniq命令常用选项说明:
短参数 | 长参数 | 说明 |
---|---|---|
-c | --count | 在每行前加上表示相应行目出现次数的前缀编号 |
-d | --repeated | 只输出重复的行 |
-D | --all-repeated[=delimit-method | 显示所有重复的行delimit-method={none(default),prepend,separate} 以空行为界限 |
-f | --skip-fields=N | 比较时跳过前N 列 |
-i | --ignore-case | 在比较的时候不区分大小写 |
-s | --skip-chars=N | 比较时跳过前N 个字符 |
-u | --unique | 只显示唯一的行 |
-z | --zero-terminated | 使用'\0'作为行结束符,而不是新换行 |
-w | --check-chars=N | 对每行第N 个字符以后的内容不作对照 |
--help | 显示此帮助信息并退出 | |
--version | 显示版本信息并退出 |
diff和patch命令
diff命令可以对比分析出两个文件的不同之处,方便查看改动过的位置和内容。
[root@localhost data]# cat test.txt
123
234
345
[root@localhost data]# cat test2.txt
123
456
789
[root@localhost data]# diff test.txt test2.txt
2,3c2,3
< 234
< 345
---
> 456
> 789
我们来说明一下该输出结果的含义,要明白diff比较结果的含义,我们必须牢记一点,diff描述两个文件不同的方式是告诉我们怎么样改变第一个文件之后与第二个文件匹配。我们看看上面的比较结果中的第一行 2,3c2,3 前面的数字2,3表示第一个文件中的行,中间有一个字母c表示需要在第一个文件上做的操作(a=add,c=change,d=delete),后面的数字2,3表示第二个文件中的行。
2,3c2,3 的含义是:第一个文件中的第[2,3]行(注意这是一个闭合区间,包括第2行和第3行)需要做出修改才能与第二个文件中的[2,3]行相匹配。
接下来的内容则告诉我们需要修改的地方,前面带 < 的部分表示左边文件的第[2,3]行的内容,而带> 的部分表示右边文件的第[2,3]行的内容,中间的 --- 则是两个文件内容的分隔符号。
[root@localhost data]# diff test.txt test2.txt -y -W 30 # -y:并排对比,-W:指定行宽度,| 表示两个文件的不同之处
123 123
234 | 456
345 | 789
[root@localhost data]# diff -u test.txt test2.txt # -u:使用unified格式显示
--- test.txt 2020-01-01 16:30:56.498139453 +0800 # -:表示第一个文件
+++ test2.txt 2020-01-01 16:38:36.734143355 +0800 # +:表示第二个文件
@@ -1,3 +1,3 @@ # -1,3:表示第一个文件的第1到第3行,+1,3:表示第二个文件的第1到第3行
123
-234 # -开头的行表示从第一个文件删除此行可以得到第二个文件
-345
+456 # +开头的行表示从第一个文件增加此行可以得到第二个文件
+789
patch命令
patch命令让用户利用设置修补文件的方式,修改,更新原始文件。,结合diff的输出unified格式信息和两个文件的任意一个,就可以生成另一个文件。
[root@localhost data]# diff -u test.txt test2.txt >diff.log #patch还原文件
[root@localhost data]# ls
diff.log ping test2.txt test.txt
[root@localhost data]# rm -f test2.txt
[root@localhost data]# ls
diff.log ping test.txt
[root@localhost data]# patch -b test.txt diff.log
patching file test.txt
[root@localhost data]# ls
diff.log ping test.txt test.txt.orig
[root@localhost data]# cat test.txt.orig
123
234
345
[root@localhost data]# cat test.txt
123
456
789