首页 > 代码库 > 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