设为首页 收藏本站
查看: 1095|回复: 0

第五章 shell学习之文件的排序、合并和分割

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-8-15 08:57:01 | 显示全部楼层 |阅读模式
sort命令
sort [选项] [输入文件]
选项:
-c 测试文件是否已经排序,如果未被排序则输出第一个未被排序的记录
-k 指定排序的域
-m 合并两个已排序的文件,合并的文件也已经排序,如sort -m a1 a2,a1的记录被有序的插入a2
-n 根据数字的大小进行排序,一般放在域号后,如-k3n
-o 将输出重定向到指定文件
-r 将排序结果逆向显示
-t 改变域分割符,如-t:
-u 去除结果中的重复行
sort和awk联合
例:
[iyunv@localhost tmp]# cat test1.txt
B liu
dfad
dfw,sfa
A clc
wers
sdfa,werw
F kkk
ckaf
fdwae,fwefs
E ccc
werw
sfdf,cdfae
[iyunv@localhost tmp]# cat test1.txt | awk -v RS="\n\n" '{gsub("\n","@");print $0}' | sort | awk 'BEGIN {ORS="\n\n"} {gsub("@","\n");print $0}'
A clc
wers
sdfa,werw
B liu
dfad
dfw,sfa
E ccc
werw
sfdf,cdfae
F kkk
ckaf
fdwae,fwefs
uniq命令
去除文本中连续重复的行,不连续重复的行不能去除(这是和sort -u的区别)
选项:
-c 打印每行在文本总重复出现的次数
-d 只显示重复的记录,每个重复的记录只显示一次
-u 只显示没有重复的记录
例:统计字数
[iyunv@localhost tmp]# cat test2.txt
thank you all the same,but no thank you,you are same with him.
did you right.
[iyunv@localhost tmp]# cat a4.sh
#! /bin/sh
argc=1
e_badarg=55
e_nofile=56
if [ $# -ne $argc ]   #参数个数错误
then
echo "arg error"
exit $e_badarg
fi
if [ ! -f $1 ]   #文件未找到
then
echo "file no found"
exit $e_nofile
fi
sed -e 's/\./ /g' -e 's/\,/ /g' -e 's/ /\n/g' "$1" | sed '/^$/d' | sort | uniq -c | sort -rn
exit 0
[iyunv@localhost tmp]# ./a4.sh test2.txt
      4 you
      2 thank
      2 same
      1 with
      1 the
      1 right
      1 no
      1 him
      1 did
      1 but
      1 are
      1 all
join命令
实现两个文件记录的连接操作,即将两个文件中具有相同域的记录选出来,把这两个记录的所有域放到同一行
注意join只能对按照两个按照相同域排序的文件进行连接
选项:
-a1或-a2 除了显示共同域,-a1或-a2分别显示第一或第二个文件中没有的共同域的记录
-i 比较域的内容时忽略大小写
-o 设置结果显示的格式
-t 改变域分隔符
-v1或-v2 分别显示第一或第二个文件中没有的共同域的记录,但不显示共同域连接结果
-1和-2 分别设置文件1和文件2用于连接的域
例:
1.
[iyunv@localhost tmp]# cat test3.txt
clc1:111:A
clc2:222:B
clc4:444:D
clc5:555:E
[iyunv@localhost tmp]# cat test4.txt
clc1:aaa:A
clc2:bbb:B
clc3:ccc:C
clc5:eee:E
[iyunv@localhost tmp]# join -t: test3.txt test4.txt
clc1:111:A:aaa:A
clc2:222:B:bbb:B
clc5:555:E:eee:E
默认只显示两个文件有共同域的连接结果
2.
[iyunv@localhost tmp]# join -t: -a1 test3.txt test4.txt
clc1:111:A:aaa:A
clc2:222:B:bbb:B
clc4:444:D
clc5:555:E:eee:E
[iyunv@localhost tmp]# join -t: -v1 test3.txt test4.txt
clc4:444:D
clc4:222:D为test3.txt特有
3.
[iyunv@localhost tmp]# join -t: -1 3 -2 3 test3.txt test4.txt
A:clc1:111:clc1:aaa
B:clc2:222:clc2:bbb
E:clc5:555:clc5:eee
以第一个文件的第3个域和第二个文件的第3个域作为连接的域,默认都为第一个域,注意连接的域放在了第一位
4.
[iyunv@localhost tmp]# join -t: -1 3 -2 3 -o 1.1 1.3 2.2 1.2 test3.txt test4.txt
clc1:A:aaa:111
clc2:B:bbb:222
clc5:E:eee:555
调整显示的位置,1.1为先显示文件1的第一个域
cut命令
从标准输入或文本文件中按字符或者域提取文本
选项:
-c 按字符提取
-f 按域提取
-d 定义域分隔符,相当于sort和join的-t
例:
[iyunv@localhost tmp]# cat test3.txt
clc1:111:A
clc2:222:B
clc4:444:D
clc5:555:E
[iyunv@localhost tmp]# cut -c1,4 test3.txt
c1
c2
c4
c5
[iyunv@localhost tmp]# cut -d: -f2-3 test3.txt
111:A
222:B
444:D
555:E
paste命令
将文本文件或者标准输出的数据粘贴到一起
paste [选项] 文件1 文件2
选项:
-d 设置输出的域分隔符,默认为tab
-s 将每个文件粘贴成一行
格式:文件1的记录1分隔符文件1的记录2...  换行 文件2的记录1分隔符文件2的记录2...
而默认格式:文件1的记录1分隔符文件2的记录1 换行 文件1的记录2分隔符文件2的记录2
- 从标准输入中读取数据
例:
[iyunv@localhost tmp]# cat test3.txt
clc1:111:A
clc2:222:B
clc4:444:D
clc5:555:E
clc6:666:F
[iyunv@localhost tmp]# cat test4.txt
clc1:aaa:A
clc2:bbb:B
clc3:ccc:C
clc5:eee:E
[iyunv@localhost tmp]# paste test3.txt test4.txt
clc1:111:A      clc1:aaa:A
clc2:222:B      clc2:bbb:B
clc4:444:D      clc3:ccc:C
clc5:555:E      clc5:eee:E
clc6:666:F
[iyunv@localhost tmp]# paste -s test3.txt test4.txt
clc1:111:A      clc2:222:B      clc4:444:D      clc5:555:E      clc6:666:F
clc1:aaa:A      clc2:bbb:B      clc3:ccc:C      clc5:eee:E
[iyunv@localhost tmp]# paste -d@ test3.txt test4.txt
clc1:111:A@clc1:aaa:A
clc2:222:B@clc2:bbb:B
clc4:444:D@clc3:ccc:C
clc5:555:E@clc5:eee:E
clc6:666:F@
[iyunv@localhost tmp]# paste -s -d@ test3.txt test4.txt
clc1:111:A@clc2:222:B@clc4:444:D@clc5:555:E@clc6:666:F
clc1:aaa:A@clc2:bbb:B@clc3:ccc:C@clc5:eee:E
[iyunv@localhost tmp]# ls | paste -d: - - - -      #以:为分隔符每行显示4个文件
1c:a:a1:a1~
a1.awk:a2.awk:a3.awk:a4.awk
a4.sh:aa:aabc:aac
a.awk:a.sh:b:b1
split命令
把大文件切割存放在多个小文件中
split [选项] 待切割的大文件 输出的小文件
选项:
-或-l 两个等价,指定大文件几行被切一次
-b 指定大文件多少字节被切一次
-C 与-b类似,但是尽量维持每行的完整性
例:
1.按行分割文件
[iyunv@localhost tmp]# cat test3.txt
clc1:111:A
clc2:222:B
clc4:444:D
clc5:555:E
clc6:666:F
[iyunv@localhost tmp]# split -2 test3.txt clc.txt
[iyunv@localhost tmp]# ls clc*
clc.txtaa  clc.txtab  clc.txtac
[iyunv@localhost tmp]# cat clc.txtaa
clc1:111:A
clc2:222:B
[iyunv@localhost tmp]# cat clc.txtab
clc4:444:D
clc5:555:E
[iyunv@localhost tmp]# cat clc.txtac
clc6:666:F
2.按字节分割文件
[iyunv@localhost tmp]# ll test3.txt
-rw-r--r-- 1 root root 55 Dec 15 18:20 test3.txt
[iyunv@localhost tmp]# split -b 20 test3.txt clc.db
[iyunv@localhost tmp]# ll clc.db*
-rw-r--r-- 1 root root 20 Dec 15 18:44 clc.dbaa
-rw-r--r-- 1 root root 20 Dec 15 18:44 clc.dbab
-rw-r--r-- 1 root root 15 Dec 15 18:44 clc.dbac
[iyunv@localhost tmp]# cat clc.dbaa
clc1:111:A
clc2:222:[iyunv@localhost tmp]# cat clc.dbab
B
clc4:444:D
clc5:55[iyunv@localhost tmp]# cat clc.dbac
5:E
clc6:666:F
3.按字节分割文件但是尽量保留行的完整性
[iyunv@localhost tmp]# split -C 20 test3.txt clc.db
[iyunv@localhost tmp]# ll clc.db*
-rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbaa
-rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbab
-rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbac
-rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbad
-rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbae
[iyunv@localhost tmp]# cat clc.dbaa
clc1:111:A
...
tr命令
实现字符转换功能,可用sed代替
只能标准输入,即要么将文件重定向到标准输入,要么用管道
tr [选项] 字符串1 字符串2 <输入文件
选项:
-c 反选字符串1
-d 删除标准输入在字符串1中出现的所有字符
-s 删除标准输入在字符串1中出现的重复字符,只保留1个
例:
[iyunv@localhost tmp]# cat test3.txt
clc1:111:A
clc2:222:B
clc4:444:D
clc5:555:E
clc6:666:F
1.删除0-9
[iyunv@localhost tmp]# tr -d 0-9 < test3.txt
clc::A
clc::B
clc::D
clc::E
clc::F
2.去除标准输入(test3.txt)中重复的数字,保留1个
[iyunv@localhost tmp]# tr -s 0-9 < test3.txt
clc1:1:A
clc2:2:B
clc4:4:D
clc5:5:E
clc6:6:F
3.去除除了数字以外的重复字符,保留一个(这个例子中去除了/n)
[iyunv@localhost tmp]# tr -sc 0-9 < test3.txt
clc1:111:A
clc2:222:B
clc4:444:D
clc5:555:E
clc6:666:F
tar命令
压缩和解压缩
压缩包有两种,tar格式和gzip格式,gzip格式相当于在tar格式上再进行进一步压缩
tar [选项] 文件或目录
选项:
-c 创建新的包
-r 为包添加新的文件
-t 列出包内容
-u 更新包中的文件,如无此文件则添加,课代替-r
-x 解压缩文件
-f 使用压缩文件或设备,必选
-v 显示tar处理文件的信息
-z 用gzip压缩和解压缩文件,若创建压缩包(-c)加上-z则解压(-x)也要加上-z,实质上为先tar -cf变为tar再gzip变为gzip
不能直接往gzip格式的包中添加(-r或-u)文件,要先变为tar格式(gzip -d),添加(tar -rf)完后在进一步压缩成gzip格式(gzip)
例:
[iyunv@localhost tmp]# ls clc* test*.txt
clc.dbaa  clc.dbac  clc.dbae   test2.txt  test4.txt
clc.dbab  clc.dbad  test1.txt  test3.txt
[iyunv@localhost tmp]# tar -zcf all.tar.gz clc*      #创建压缩文件,直接压缩成gzip格式
[iyunv@localhost tmp]# tar -tf all.tar.gz         #查看压缩包内容
clc.dbaa
clc.dbab
clc.dbac
clc.dbad
clc.dbae
[iyunv@localhost tmp]# gzip -d all.tar.gz    #把gzip压缩包解压成tar压缩包
[iyunv@localhost tmp]# ls all*
all.tar
[iyunv@localhost tmp]# tar -rf all.tar test*.txt    #往tar压缩包添加文件,注意不能往gzip直接添加文件
[iyunv@localhost tmp]# tar -tf all.tar
clc.dbaa
clc.dbab
clc.dbac
clc.dbad
clc.dbae
test1.txt
test2.txt
test3.txt
test4.txt
[iyunv@localhost tmp]# gzip all.tar   #重新把tar压缩成gzip格式
[iyunv@localhost tmp]# ls all*
all.tar.gz
[iyunv@localhost tmp]# ls clc* test*.txt    #被打包文件并没有消失
clc.dbaa  clc.dbac  clc.dbae   test2.txt  test4.txt
clc.dbab  clc.dbad  test1.txt  test3.txt
[iyunv@localhost tmp]# rm -f clc* test*.txt
[iyunv@localhost tmp]# tar -zxvf all.tar.gz     #解压gzip包,如果解压tar包则不用z选项
clc.dbaa
clc.dbab
clc.dbac
clc.dbad
clc.dbae
test1.txt
test2.txt
test3.txt
test4.txt
[iyunv@localhost tmp]# ls clc* test*.txt
clc.dbaa  clc.dbac  clc.dbae   test2.txt  test4.txt
clc.dbab  clc.dbad  test1.txt  test3.txt



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-23874-1-1.html 上篇帖子: 第四章 shell学习之sed命令和awk编程 下篇帖子: 第六章 shell学习之变量和引用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表