[Linux Shell学习系列三]常用Shell(Bash)命令-文本处理

D9

1. sort命令

sort命令用于将文本文件的行排序。默认按照字符串的字母顺序排序。

$ cat test.txt #源文件
abc
def
ghi
def

$ sort test.txt #默认按照字母顺序排序
abc
def
def
ghi

$ sort -u test.txt #使用-u选项,可以删除重复的行
abc
def
ghi


$ cat test.txt #内容为数字的源文件
20
10
35
100
69

$ sort test.txt #默认按照字母顺序排序,100排在20前面
10
100
20
35
69

$ sort -n test.txt #使用-n选项,可以将数字按照数值大小排序
10
20
35
69
100

$ sort -n -r test.txt #使用-r选项,可以按照倒序排序
100
69
35
20
10

$ sort file1 file2 #可以同时对多个文件的内容排序


$ cat test.txt #具有多列的源文件,以,分列
20,a
10,b
35,e
100,d
69,c

$ sort test.txt #默认以第一列的字符串字母顺序排序
10,b
100,d
20,a
35,e
69,c

$ sort -t ',' -k 2 test.txt #使用-t选项指定列的分隔符,使用-k选项指定进行排序的列,这里是第2列
20,a
10,b
69,c
100,d
35,e

$ cat test.txt #第二列为数字的源文件
a,10
c,20
d,35
e,100

$ sort -t ',' -k2n test.txt #用第二列排序,使用-n选项指定为数值顺序
a,10
c,20
d,35
e,100

$ sort -t ',' -k2nr test.txt #用第2列排序,使用-r选项指定为倒序排序
e,100
d,35
c,20
a,10

 

2. uniq命令

uniq命令用于移除或发现文件中重复的条目。

$ cat test.txt #文件中存在重复的行
aaa
aaa
bbb
ccc
bbb
$ uniq test.txt #移除文件中重复的行(必须是相邻的)
aaa
bbb
ccc
bbb
$ uniq -c test.txt #使用-c选项,可以统计重复行出现的次数
      2 aaa
      1 bbb
      1 ccc
      1 bbb
$ uniq -d test.txt #使用-d选项,显示文件中重复的行并只显示一次
aaa

$ uniq -D test.txt #使用-D选项,显示文件中所有重复的行
aaa
aaa
$ uniq -u test.txt #使用-u选项,只显示文件中不重复的行
bbb
ccc
bbb

$ cat test.txt #具有两列的源文件
aaa bbb
aaa ccc
bbb aaa
ccc aaa
bbb aaa
$ uniq -w 3 test.txt #使用-w参数,指定比较前N个字符是否重复
aaa bbb
bbb aaa
ccc aaa
bbb aaa
$ uniq -s 3 test.txt #使用-s参数,指定比较时跳过前N个字符,只比较后面的字符是否重复
aaa bbb
aaa ccc
bbb aaa
$ uniq -f 1 test.txt #使用-f参数,指定比较时跳过前N列,只比较后面的字符是否重复
aaa bbb
aaa ccc
bbb aaa

 

3. tr命令

tr命令用于转换字符、删除字符和压缩重复的字符。它从标准输入读取数据并将结果输出到标准输出。

语法:tr [OPTION]... SET1 [SET2]

$ echo linuxShell | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ #将标准输入中所有SET1中的字符,替换为SET2中相同位置的字符
LINUXSHELL
$ echo linuxShell | tr [:lower:] [:upper:] #与上面的相同
LINUXSHELL
$ echo linuxShell | tr a-z A-Z #与上面的相同
LINUXSHELL

$ cat input #用于输入的文件内容
{linuxShell}
$ tr '{}' '()' < input > output #从文件输入并输出到文件,将大括号转为小括号
$ cat output #输出的文件内容
(linuxShell)

$ echo "This is for testing." | tr ' ' '\t' #将空格转为制表符
This    is      for     testing.

$ echo "This    is    for testing." | tr ' ' '\t' #如果有重复的空格,则逐个替换
This                            is                              for     testing.
$ echo "This    is    for testing." | tr -s ' ' '\t' #使用-s选项,将重复的空格进行压缩
This    is      for     testing.

$ echo "This is for testing." | tr -d a-f #使用-d选项,删除指定的字符,这里删除a到f的小写字母
This is or tsting.

$ echo "This is NO.23456." | tr -d [:digit:] #使用-d选项,删除数字
This is NO..

$ echo "This is NO.23456." | tr -c -d [:digit:] #使用-c配合-d选项,删除数字以外的所有字符
23456

 

4. grep命令

grep命令用于搜索文本或指定的文件中与指定的字符串或模式相匹配的行。默认只显示匹配的行。

语法:grep [OPTION]... PATTERN [FILE]...

grep [OPTION]... [-e PATTERN | -f FILE] [FILE]...

$ cat test.txt #源文件
AAA BBB
aaa bbb
ccc ab
bbb ccc

$ grep a test.txt #查找文件中a
aaa bbb
ccc ab

$ grep -i a test.txt #使用-i选项,忽略搜索关键字的大小写
AAA BBB
aaa bbb
ccc ab

$ grep -r a backup #使用-r选项,递归搜索指定目录下所有文件
backup/a/test/d/d.txt:aaa

$ grep -rl a backup #使用-l选项配合-r选项,递归搜索指定目录下所有文件,只输出包含匹配指定模式的行的文件名
backup/a/test/d/d.txt

$ cat test.txt #源文件
a b
AAA BBB
aaa bbb
ccc ab
bbb ccc
$ grep a test.txt #默认匹配扩展的字符串,如aaa,ab
a b
aaa bbb
ccc ab
$ grep -w a test.txt #使用-w选项,只匹配包含指定单词a的行,而不扩展
a b

$ grep -c a test.txt #使用-c选项,报告文件或文本中模式被匹配的次数
3
$ grep -n a test.txt #使用-n选项,显示每一个匹配的行的行号
1:a b
3:aaa bbb
4:ccc ab

$ grep -v a test.txt #使用-v选项,输出除匹配的行之外的其他所有行(即不包含a的行)
AAA BBB
bbb ccc

$ grep --color a test.txt #使用--color选项,在输出中将匹配的字符串以彩色的形式标出
a b
aaa bbb
ccc ab

$ cat test.txt |grep -i a #与管道一起使用
a b
AAA BBB
aaa bbb
ccc ab

 

5. diff命令

diff命令用于比较两个文件,并找出它们的不同。

语法:diff [OPTION]... from-file to-file

$ cat t1.txt #源文件1
l1:aaa
l2:bbb
l3:ccc


l4:ddd
l5:eee

l6:fff
l7:ggg
l8:hhh
l9:iii
$ cat t2.txt #源文件2
l1:aaa 1
l2:bbb
l3:ccc


l6:fff
l7: g g g
l8:hhh

$ diff t1.txt t2.txt #使用diff比较两个源文件
1c1 #表示第1行不一致
< l1:aaa #小于号表示第一个文件的行
---
> l1:aaa 1 #大于号表示第二个文件的行
6,8d5 #表示第一个文件比第二个文件在第5行后面多了6-8行
< l4:ddd #小于号表示第一个文件的行
< l5:eee
< 
10c7 #表示第一个文件的第10行和第二个文件的第7行比较不一致
< l7:ggg
---
> l7: g g g #这里看出是多了空格

$ diff -w t1.txt t2.txt #使用-w选项,比较两个文件时忽略空格
1c1
< l1:aaa
---
> l1:aaa 1
6,8d5
< l4:ddd
< l5:eee
<  #可以看到显示没有第10行和第7行的不一致

$ diff -y t1.txt t2.txt #使用-y选项,并排的输出两个文件的比较结果
l1:aaa                                                        | l1:aaa 1
l2:bbb                                                          l2:bbb
l3:ccc                                                          l3:ccc


l4:ddd                                                        <
l5:eee                                                        <
                                                              <
l6:fff                                                          l6:fff
l7:ggg                                                        | l7: g g g
l8:hhh                                                          l8:hhh
l9:iii                                                          l9:iii


$ diff -yw -W 40 t1.txt t2.txt #使用-W选项,指定并列输出格式的列宽,使每行的内容可以完整显示
l1:aaa             |    l1:aaa 1
l2:bbb                  l2:bbb
l3:ccc                  l3:ccc


l4:ddd             <
l5:eee             <
                   <
l6:fff                  l6:fff
l7:ggg                  l7: g g g
l8:hhh                  l8:hhh
l9:iii                  l9:iii

$ diff -c t1.txt t2.txt #使用-c选项,以上下对比的格式输出两个文件的比较结果
*** t1.txt      Thu May 14 11:53:22 2020
--- t2.txt      Thu May 14 11:54:56 2020
***************
*** 1,12 ****
! l1:aaa #叹号表示两个文件有差异的行
  l2:bbb
  l3:ccc
  
  
- l4:ddd #减号表示第二个文件比第一个文件少的行,如果是加号+表示第二个文件比第一个文件多出的行
- l5:eee
- 
  l6:fff
! l7:ggg
  l8:hhh
  l9:iii
--- 1,9 ----
! l1:aaa 1
  l2:bbb
  l3:ccc
  
  
  l6:fff
! l7: g g g
  l8:hhh
  l9:iii

 

本节结束

posted @ 2020-05-14 11:10  workingdiary  阅读(417)  评论(0)    收藏  举报