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

《Shell脚本学习指南》第四章 文本处理工具

[复制链接]

尚未签到

发表于 2017-5-15 13:27:58 | 显示全部楼层 |阅读模式
  

4.1 排序文本


4.1.1 行的排序


未提供命令行选项时,整个记录会根据当前locale所定义的次序排序。
在传统的C locale中,也就是ASCII顺序。




4.1.2 以字段排序


-k选项的后面接着的是一个字段编号,或者是一对数字。
每个编号后面都可以接一个点号的字符位置,或修饰符字母。





如果仅指定一个字段编号,则排序键值会自该字段的起始处开始,
一直继续到记录的结尾(而非字段的结尾)。


如果给的是一对用逗号隔开的字段数字,则排序键值将由第一个字段值的起始处开始,
结束于第二个字段值的结尾。使用点号表示字符位置。
-k2.4, 5.6指的是从第二个字段的第四个字符开始比较,一直比到第五个字段的第六个字符。


$ sort -t: -k1,1 /etc/passwd   以用户名称排序
bin:x:1:1:bin:/bin:/sbin/nologin
chico:x:12501:1000:Chico Marx:/home/chico:/bin/bash
harpo:x:12502:1000:Harpo Marx:/home/harpo:/bin/ksh
...


$ sort -t: -k3,3nr /etc/passwd   反省UID排序
或-k3nr,3或-k3,3 -n -r都可以。




4.1.3 文本块的排序


有时需要对多行记录组合而成的数据排序。以地址清单为例:
$ cat my-friends
# SORTKEY: Schlo, Hans Jurgen
Hans Jurgen Schlo
Unter den Linden 78
D-10117 Berlin
Germany


# SORTKEY: Jones, Adrian
...


技巧是:利用awk识别段落间隔,在每个地址内暂时使用一个未用过的字符取代分行。
sort看到的行就会变成这样:
# SORTKEY: Schlo, Hans Jurgen^ZHans Jurgen Schlo^ZUnter den Linden 78^Z...


cat my-friends |                              读取地址文件
  awk -v RS=" " '{ gsub("\n", "^Z"); print }' |          转换地址为单行
     sort -f |                               排序地址数据,忽略大小写
       awk -v ORS="\n\n" '{ gsub("^Z", "\n"); print }' | 恢复行结构
          grep -v '# SORTKEY'                 删除标记行


1. 函数gsub()为全局性替换(global substitution),类似sed下的s/x/y/g结构。
2. RS变量时输入数据的记录分隔器(Record Separator)。
通常输入数据以换行隔开,使每行成为单个记录。
  RS=" "是一个特殊用法,指的是记录以空行隔开。

3. ORS是输出记录分隔器。


注:'{ action }'是对每个字段的操作,而RS,ORS都是对记录的设定。




4.1.5 sort的稳定性


sort并不稳定。




4.2 删除重复


sort -u是依据匹配的键值进行消除操作,而非匹配的记录。
uniq有3个好用选项:
-c在每个输出行之前加上该行重复的次数。
  -d则用于仅显示重复的行。
  -u仅显示未重复的行。




4.3 重新格式化段落


fwt -w 30




4.4 计算行数、字数以及字符数


wc的默认输出是一行报告,包括行数、字数以及字节数。
可用选项:-c(字节数)、-l(行数)、-w(字数)。
$ echo Testing one two three | wc -c
  1   4   22
$ wc /etc/passwd /etc/group




4.6 提取开头或结尾数行


显示文件列表中每一个的前n条记录:


head -n n     [file(s)]
head -n      [file(s)]
awk 'FNR <= n' [file(s)]
sed -e nq     [file(s)]
sed nq       [file(s)]


观察不断增长的系统信息日志,Ctrl-C停止tail。
$ tail -n 25 -f /var/log/messages


运维网声明 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.iyunv.com/thread-377757-1-1.html 上篇帖子: Mac文件权限管理(shell命令) 下篇帖子: 在shell 中不退出控制台执行command
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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