首页 > 代码库 > shell 文本处理的几个命名sed,awk,sort,uniq,cut

shell 文本处理的几个命名sed,awk,sort,uniq,cut


文本处理

Cat命令

 

1)  拼接文件:纵向拼接,不是横向拼接

root@docker-host-03:~# cat list list2

line2

line3

line4

line5

line5

line6 

line7

total 32K

lrwxrwxrwx 1 root root   12 Jan  4 11:30 backup -> /data/backup

-rw-r--r-- 1 root root   46 Apr  1 13:18 list

-rw-r--r-- 1 root root    0 Apr  1 13:29 list2

-rwxr-xr-x 1 root root   84 Apr  1 09:24 test.sh

drwxr-xr-x 4 root root 4.0K Apr  1 13:16test_shell

drwxr-xr-x 2 root root 4.0K Mar 28 09:42 tmp

drwxr-xr-x 6 root root 4.0K Jul 19  2016tools

 

root@docker-host-03:~# ls -lh | cat - list    #这里的-标示标准输入

total 36K

lrwxrwxrwx 1 root root   12 Jan  4 11:30 backup -> /data/backup

-rw-r--r-- 1 root root   46 Apr  1 13:18 list

-rw-r--r-- 1 root root  512 Apr  1 13:29 list2

drwxr-xr-x 10 root root 4.0K Mar 23  2016 root

-r-------- 1 root root 1.7K Mar 31 10:06 solar

drwxr-xr-x 3 root root 4.0K Dec  1 10:07testgit

-rwxr-xr-x 1 root root   84 Apr  1 09:24 test.sh

drwxr-xr-x 4 root root 4.0K Apr  1 13:16test_shell

drwxr-xr-x 2 root root 4.0K Mar 28 09:42 tmp

drwxr-xr-x 6 root root 4.0K Jul 19  2016tools

line2

line3

line4

line5

line5

line6

 

2)  格式化输出

输出行号

root@docker-host-03:~# cat -n list

    1  line2

    2  line3

    3  line4

    4  line5

    5  line5

    6  line6

 

压缩空格行

root@docker-host-03:~# cat -s list

line2

line3

line4

line5

line5

line6

 

line7

 

paste 

按列合并文件:纵向拼接

root@docker-host-03:~# paste employe.txt bonus.txt | awk ‘{print $1,$2,$3,$5}‘ | tr ‘[A-Z]‘ ‘[a-z]‘ |s

ort -s -k2

400 ashok sharma $1,250

100 jason smith $5,000

200 john doe $500

300 sanjay gupta $3,000

 

root@docker-host-03:~# cat employe.txt 

100 Jason Smith 

200 John Doe 

300 Sanjay Gupta 

400 Ashok Sharma 

root@docker-host-03:~# cat b

cat: b: No such file or directory

root@docker-host-03:~# cat bonus.txt 

100 $5,000 

200 $500 

300 $3,000 

400 $1,250 

 

cut

以列形式处理文本行

-d  以什么作为分隔符来分割列

-f  指定要显示哪几个列

 

 

排序、去重

 

Sort

-n 按照数字序列排序

-r 倒序排序

-k 指定以某列

-d 以字典序列排序

 

tac

会以逆序的方式打印输出

root@docker-host-03:~# cat list

line2 200

line3 100

line4 100

line5 700

line5 800

line6 50

line7 350

root@docker-host-03:~# cat list | tac -

line7 350

line6 50

line5 800

line5 700

line4 100

line3 100

line2 200

 

 

Uniq

Uniq会去除重复的行,但仅限于是已经拍过序的输入,或者是已经排过序的文件。

-u  只显示那些是唯一的行

-c  统计重复行出现的次数

-d  找出重复行的内容


tr命令

tr是一个构建一行命令的一个小而美的工具。tr只能接收标准输入作为命令参数。tr可以进行文件的转换、删除、压缩

替换

root@docker-host-03:~# echo "123 abcdefg:aaa:" | tr ":" "<"

123 abcd efg<aaa<


删除

root@docker-host-03:~# echo "123 abcdefg:aaa:" | tr -d ":‘

> ^C

root@docker-host-03:~# echo "123 abcdefg:aaa:" | tr -d ":"

123 abcd efgaaa


-c定义个集合,不再这个集合中的内容全部删除。

root@docker-host-03:~# echo "123 abcdefg:aaa:" | tr   -d -c ‘a-z \n‘

 abcdefgaaa

root@docker-host-03:~# echo "123 abcdefg:aaa:" | tr  ‘a-z‘ ‘A-Z‘

123 ABCD EFG:AAA:

特殊用法,能够通过字符的替换,进行字符的加密.

 

 

文本匹配搜索grep

root@docker-host-03:~# grep"hello" test.sh 

  123aab456 1232 hello

  assbbb  hello112332 asss

root@docker-host-03:~# grep"hello$" test.sh --color=auto

  123aab456 1232 hello

 

#匹配多个匹配条件

root@docker-host-03:~# grep -e"hello$" -e "asss" --color=auto ./test.sh

  123aab456 1232 hello

  assbbb  hello112332 asss

 

指定搜索的文件或路径

grep  “text” ./ -r –include  *.(cpp,c)

 


Sed

可以替换查找到的字符串为我们指定的新字符创

 

 

常规使用: 不修改原本的文件内容

root@docker-host-03:~# sed ‘s/line2/tttt/g‘list

tttt 200

line3 100

line4 100

line5 700

line5 800

line6 50

line7 350

root@docker-host-03:~# cat list

line2 200

line3 100

line4 100

line5 700

line5 800

line6 50

line7 350

 

带正则表达式匹配将已经比配的字符串当成变量使用。

这里的&,就标示着已经被匹配到的字符创,具体哪个字符创算是被匹配到的,就是我们用括号,括起来的部分。

root@docker-host-03:~# cat list

line2 200

line3 100

line4 100

line5 700

line5 800

line6 50

line7 350

root@docker-host-03:~# sed  ‘s/\w\+2 \(\w\+\)/[--&--]/g‘  list

[--line2 200--]

line3 100

line4 100

line5 700

line5 800

line6 50

line7 350

 

如果存在多字()来匹配字符串那么我们可以使用数字标号来表示具体哪个匹配

root@docker-host-03:~# sed ‘s/\(\w\+\)2\(\w\+\)/[--\1--] [\2]/g‘  list

[--line--] [200]

line3 100

line4 100

line5 700

line5 800

line6 50

line7 350

多个sed进行组合,

root@docker-host-03:~# sed ‘s/\(\w\+\)2\(\w\+\)/[--\1--] [\2]/g‘  list  |  sed ‘s/line7/tttt/g‘

[--line--] [200]

line3 100

line4 100

line5 700

line5 800

line6 50

tttt 350


awk

awk的功能十分强大,这里由于篇幅的原因,我没有列在这里,可以查看之前发过的一个篇文章及评论

http://atong.blog.51cto.com/2393905/1343553


另外有时间的建议去看看awk编程语言这本书,基本上可以跳着看书中列举的示例,200多页的书,但可以非常快的看过去。1小时候内肯定可以看得完。



本文出自 “从头开始” 博客,请务必保留此出处http://atong.blog.51cto.com/2393905/1913328

shell 文本处理的几个命名sed,awk,sort,uniq,cut