linux之文本处理

相关命令

cat -连接文件并且打印到标准输出
sort -给文本行排序
uniq -报告或者省略重复行
cut -从每行中删除文本区域
paste -合并文本行
join -基于某个共享字段来联合两个文件的文本行
comm -逐行比较两个有序的文件
diff -逐行比较文件
patch -给原始文件打补丁
tr -翻译或删除字符
sed -用于筛选和转换文本的流编辑器
aspell -交互式拼写检查器

1. cat

选项-n给文本行添加行号,-s禁止输出多个空白行

2. sort

对标准输入的内容或命令行中指定的一个或多个文件进行排序。然后把排序结果发送到标准输出。
如果我们有多个文件,想要把它们合并为一个有序的文件,可以这么做:
sort file1.txt file2.txt file3.txt > final_sorted_list.txt

选项 描述
-b 默认情况下,对整行进行排序,从每行的第一个字符开始,这个选项导致sort程序忽略每行开头的空格,从第一个非空白字符开始排序。
-f 让排序不区分大小写
-n 基于字符串的数值来排序,使用此选项允许根据数字值执行排序,而不是字母值
-r 按相反顺序排序,结果按照降序排列,而不是升序
-k 对从field1到field2之间的字符排序,而不是整行文本行
-m 把每个参数看作是一个预先排好序的文件,把多个文件合并成一个排好序的文件,而没有执行额外的排序。
-o 把排好序的输出结果发送到文件,而不是标准输出
-t 定义域分割字符。默认情况下,域由空格或制表符分隔

[me@linuxbox ~]$ sort -t ‘:’ -k 7 /etc/passwd | head
通过指定冒号字符做为字段分隔符,我们能按照第七字段排序。

3. uniq

与sort程序相比,这个uniq程序是个轻量级程序,uniq执行一个看似琐碎的行为。当给定一个排好序的文件,uniq会删除任意重复行,并且把结果发送到标准输出。它常常和sort程序一块使用,来清理重复的输出。
-u选项可以从排好序的输出结果中删除重复行。
sort foo.txt | uniq

常用的uniq选项

选项 说明
-c 输出所有的重复行,并且每行开头显示重复的次数
-d 只输出重复行,而不是特有的文本行
-f n 忽略每行开头的n个字段,字段之间由空格分隔,正如sort程序中的空格分隔符,然而,不同于sort程序,uniq没有选项来设置备用的字段分隔符。
-i 在比较文本行的时候忽略大小写
-s n 跳过(忽略)每行开头的n个字符
-u 只输出独有的文本行,这是默认的

4 cut

这个cut程序被用来从文本行中抽取文本,并把其输出到标准输出,它能够接受多个文件参数或者标准输入。

cut 程序选择项

选项 说明
-c char_list 从文本行中抽取由char_list定义的文本。这个列表可能由一个或多个逗号分隔开的数值区间组成
-f field_list 从文本行抽取一个或多个由field_list定义的字段。这个列表可能包括一个或多个字段,或由逗号分隔开的字段区间
-d delim_char 当指定-f选项之后,使用delim_char作为字段分隔符,默认情况下,字段之间必须由单个tab字符分隔开
–complement 抽取整个文本行,除了那些由-c和/或-f选项指定的文本

[me@linuxbox ~]$ cut -f 3 distros.txt | cut -c 7-10

5 paste

这个paste命令的功能刚好和cut相反,它会添加一个或多个文本列到文件中,而不是从文件中抽取文本列。它通过读取多个文件,然后把每个文件中的字段整合成单个文本流,输入到标准输出。
paste distros-dates.txt distros-versions.txt
将两个文件中的内容合并

6 join

它把来自多个基于共享关键域的文件的数据结合起来。
[me@linuxbox ~]$ join distros-key-names.txt distros-key-vernums.txt | head
为了使join命令能正常工作,所有文件必须按照关键数据域排序

7 比较文本
7.1 comm

这个comm程序会比较两个文本文件,并且会显示每个文件特有的文本行和共有的文本行。
[me@linuxbox ~]$ comm -12 file1.txt file2.txt
这个命令行隐藏1,2两列

8 diff

类似于comm程序,diff程序被用来检测文件之间的差异。然而,diff是一款更加复杂的工具,它支持许多输出格式,并且一次能处理许多文本文件。软件开发员经常使用diff程序来检查不同程序源码版本之间的更改,diff能够递归地检查源码目录,经常称之为源码树。diff程序的一个常见用例是创建diff文件或补丁,它会被其它程序使用,例如patch程序,来把文件从一个版本转换到另一个版本。

diff更改命令

改变 说明
r1ar2 把第二个文件中位置r2处的文本行添加到第一个文件中的r1处
r1cr2 用第二个文件中位置r2处的文本行更改(替换)位置r1处的文本行
r1dr2 删除第一个文件中位置r1处的文本行,这些文本行将会出现在第二个文件中位置r2处

在这种格式中,一个范围就是由逗号分隔开的开头行和结束行的列表。
当使用上下文模式(带上-c选项)

diff 上下文模式更改指示符

指示符 含义
blank 上下文显示行,它并不表示两个文件之间的差异
- 删除行。这一行将会出现在第一个文件中,而不是第二个文件内
+ 添加行。这一行将会出现在第二个文件内,而不是第一个文件中
更改行。将会显示某个文本行的两个版本,每个版本会出现在更改组的各自部分

统一模式相似于上下文模式(通过-u选项来指定),但是更加简洁。
上下文模式和统一模式之间最显著的差异就是重复上下文的消除,这就使得统一模式的输出结果要比上下文模式的输出结果简短。

diff统一模式更改指示符

字符 含义
空格 两个文件都包含这一行
- 在第一个文件中删除这一行
+ 添加这一行到第一个文件中

9 patch

这个patch程序被用来把更改应用到文本文件中。它接受从diff程序的输出,并且通常被用来把较老的文件版本转变为较新的文件版本。

10 运行时编辑

我们对于文本编辑器的经验是它们主要是交互式的,意思是我们手动移动光标,然后输入我们的修改。也有非交互式的方法来编辑文本。例如,有可能通过单个命令把一系列修改应用到多个文件中。

11 tr

这个tr程序被用来更改字符,我们可以把它看作是一种基于字符的查找和替换操作。换字是一种把字符从一个字母装换为另一个字母的过程。例如,把小写字母转换成大写字母就是换字,我们可以通过tr命令来执行这样的转换:
[me@linuxbox ~]$ echo “lowercase letters” | tr a-z A-Z
大多数情况下,两个字符集应该长度相同,然而,有可能第一个集合大于第二个,尤其如果我们想要把多个字符转换为单个字符:
[me@linuxbox ~]$ echo “lowercase letters” | tr [:lower:] A
除了换字之外,tr命令能允许字符从输入流中简单地被删除:
tr -d ‘\r’ < dos_file > unix_file
这里的dos_file是需要被转换的文件,unix_file是转换后的结果,这种形式的命令使用转义序列\r来代表回车符。
tr也可以完成另一个技巧,使用-s选项,tr命令能”挤压“(删除)重复的字符实例:
[me@linuxbox ~]$ echo “aaabbbccc” | tr -s ab
abccc
将ab挤压掉,注意重复的字符必须是相邻的。如果不相邻则无效。

11 sed

stream editor(流编辑器)的简称。它对文本流,即一系列指定的文件或标准输入进行编辑。
总之,sed的工作方式是要不给出单个编辑命令(在命令行中)要不就是包含多个命令的脚本文件名,然后它就按行来执行这些命令。

[me@linuxbox ~]$ echo "front" | sed '1s/front/back/'
back
[me@linuxbox ~]$ echo "front" | sed '2s/front/back/'
front

sed中的大多数命令之前都会带有一个地址,其指定了输入流中要被编辑的文本行,如果省略了地址,然后会对输入流中的每一行执行编辑命令,最简单的地址形式是一个行号。给我们的命令添加地址1,就导致只对仅有一行文本的输入流的第一行执行替换操作。如果我们指定另一个数字,我们看到没有执行这个编辑命令,因为我们的输入流没有第二行。

sed 地址表示法

地址 含义
n 行号,n是一个正整数
/regexp/ 所有匹配一个POSIX基本正则表达式的文本行
addr1,addr2 从addr1到addr2范围内的文本行,包括地址addr2在内
first~step 匹配由数字first代表的文本行,然后随后的每个在step间隔处的文本行
addr1,+n 匹配地址addr1和随后的n个文本行
addr! 匹配所有的文本行,除了addr之外,addr可能是上述任意的地址形式

[me@linuxbox ~]$ sed -n ‘1,5p’ distros.txt
我们打印出一系列的文本行,开始于第一行,直到第五行,为此,我们使用p命令,其就是简单地把匹配的文本行打印出来。然而为了高效,我们必须包含选项-n(不自动打印选项),让sed不要默认打印每一行。

sed 基本编辑命令

命令 含义
= 输出当前的行号
a 在当前行之后追加文本
d 删除当前行
i 在当前行之前插入文本
p 打印当前行
q 退出sed,不再处理更多的文本行,如果不指定-n选项,输出当前行
Q 退出sed,不再处理更多的文本行
s/regexp/replacement/ 只要找到一个regexp匹配项,就替换为replacement内容
y/set1/set2 执行字符转写操作,通过把set1中的字符转变为相对应的set2中的字符。注意,不同于tr程序,sed要求两个字符集合具有相同的长度

[me@linuxbox ~]$ echo “aaabbbccc” | sed ‘s/b/B/’
aaaBbbccc
通过添加g标志,我们能够更改所有的实例:
[me@linuxbox ~]$ echo “aaabbbccc” | sed ‘s/b/B/g’
aaaBBBccc

12 aspell

一款交互式的拼写检查器。
aspell check textfile
这里textfile是要检查的文件名。

猜你喜欢

转载自blog.csdn.net/weixin_41811413/article/details/86582956
今日推荐