Shell脚本学习指南之文本处理工具

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

(0)

相关推荐

  • Shell脚本学习指南之文本处理工具

    4.1 排序文本 4.1.1 行的排序未提供命令行选项时,整个记录会根据当前locale所定义的次序排序.在传统的C locale中,也就是ASCII顺序. 4.1.2 以字段排序-k选项的后面接着的是一个字段编号,或者是一对数字.每个编号后面都可以接一个点号的字符位置,或修饰符字母. 如果仅指定一个字段编号,则排序键值会自该字段的起始处开始,一直继续到记录的结尾(而非字段的结尾). 如果给的是一对用逗号隔开的字段数字,则排序键值将由第一个字段值的起始处开始,结束于第二个字段值的结尾.使用点号表

  • shell脚本学习指南[五](Arnold Robbins & Nelson H.F. Beebe著)

    作者告诉我们:到目前为止基础已经搞定,可以将前边所学结合shell变成进军中等难度的任务了.激动的要哭了,终于看到本书结束的曙光了 T T .码字比码代码还辛苦.不过令人兴奋的是立刻就学以致用了,花了一天半的时间处理了一个3.8G的服务器日志文件,你妹啊,破电脑内存才2G.不过切割化小然后写了几个awk文件和sh文件按规则处理合并,算是搞定了! 第十一章扩展实例:合并用户数据库 问题描述就是有两台UNIX的计算机系统,这两个系统现在要合并,用户群同样需要合并.有许多用户两台系统上都有帐号.现在合

  • shell脚本学习指南[二](Arnold Robbins & Nelson H.F. Beebe著)

    该进入第四章了,刚才看到一个帖子标题:我空有一身泡妞的好本领,但可惜自己是个妞.汗-这个...音乐无国界嘛,这个不应该也没性别界么? 第四章文本处理工具 书中先说明了以下排序的规则,数值的就不用说了,该大就大该小就小,但是字符型很多时候是区分声调或者重音的.在命令行中输入locale查看自己系统的编码配置.默认的是系统配置里的,但是可以自己设置排序的编码.如: 复制代码 代码如下: $ LC_ALL=C sort french-english #以传统ASCII码顺序排序 下边介绍以下排序命令s

  • shell脚本学习指南[一](Arnold Robbins & Nelson H.F. Beebe著)

    第一章略过,下边从第二章开始,大家懂得.ps:这里发生了一件非常当我蛋疼的事情,非常!已经码文章码到第四章了,悲剧的按错浏览器按钮刷新掉,怎么也找不回来之前写的东西了.想死!算了,复习一边吧.以下全文均属自己总结书写,有错误的地方也未必是书中错误(当然也有可能是书中错误,但是我都会亲自操作滴),可能是我写错,请大牛指正. 第二章入门 因为第二遍写,就简单快速的写吧,尽量写清楚.大家都知道的终端命令cd啊 chmod啊 who啊之类的组合在一起加上一些控制语句,变量什么的就成shell编程了,给出

  • shell脚本学习指南[三](Arnold Robbins & Nelson H.F. Beebe著)

    今天木有冷笑话,只有一个噩耗.噩耗是:今天木有冷笑话!!!不要总想着冷笑话嘛,有点追求,听毛主席的话:好好学习,天天向上! 第七章输入输出.文件与命令执行 学C的应该了解标准输入输出和错误输出吧?感觉总打很多字进度太慢,所以一直在省略类似C的东西,也方便以后看这篇文章的人能够快速学完shell脚本(或者是快速看完这本书). 读取行read命令是重要方式之一,它可以自标准输入读取行后,通过shell字段切割的功能(使用$IFS)进行切分,第一部分给第一个变量,第二部分给第二个,类推.如果切割单词多

  • shell脚本学习指南[六](Arnold Robbins & Nelson H.F. Beebe著)

    学shell到现在了,一直以为自己不会犯一个大家常说的非常二的问题,结果这本书最后的时候犯了个十分2的事,晚节不保啊!!!我在测试文件路径下除了通配符*和?外还能用啥正则那样的东西,结果就在$HOME下执行了rm .* ...好吧,蛋疼了一下午!还木找回任何一个配置文件.警示后人,千万别使用rm试通配符!任何时候小心使用rm! 第十四章shell可移植性议题和扩展 可以先通读这篇文章.想写出好的可移植性shell,不仅要了解各种shell版本间的差异,还要有很多编程技巧,比如尽量从环境变量中获取

  • shell脚本学习指南[四](Arnold Robbins & Nelson H.F. Beebe著)

    回忆起一件事情:之前用linux寻找中文输入法的时候,在百度输入了fcitx,然后结果上边有个,您要找的是不是: 讽刺腾讯 .本来一直记不住这个输入法名字,不过以后哥就记住这个输入法的名字是怎么拼了,感谢百度. 第九章awk的惊人表现 awk的调用可以定义变量.提供程序并且指定输入文件,语法: 复制代码 代码如下: awk [ -F fs ] [ -v var=value ... ] 'program' [ -- ] [ var=value ... ] [file(s) ]awk [ -F fs

  • Shell脚本学习指南之查找与替换介绍

    3.1 查找文本grep:使用POSIX定义的基本正则表达式(BRE).egrep:使用扩展正则表达式(ERE).fgrep:快速grep.使用优化的算法,匹配固定字符串而非正则表达式. 1992 POSIX标准将这三个改版整合成一个grep程序. $ who | grep -F austen使用-F选项查找固定字符串.事实上,只要匹配的模式里未含有正则表达式的meta字符,则grep默认行为模式就等同于使用了-F. 3.2.6 在文本文件里进行替换一般来说,执行文本替换的正确程序应该是sed

  • shell脚本学习与总结

    1.shell 脚本是区分小写的2.Unix特殊字符有: ( ; $ ? & * () [] ` ' " + 使用其时要进行转义()3.Shell的注释以#开头4.函数的定义Function fuction_name(){Command to execute}调用时直接用function_name.5.控制结构1)If...then语句If [ test_command ]ThenCommandsif2)If...then...else语句If [ test_command ]ThenC

  • Centos7 Shell编程之正则表达式、文本处理工具详解

    目录 1. 正则表达式 1.1 常规匹配 1.2 常用特殊字符 2. 文本处理工具 2.1 cut 2.2 awk 1. 正则表达式 正则表达式可以很灵活的提供各种模糊匹配的筛选规则.常被用来检索.替换那些符合某个模式的文本.grep.sed.awk等文本处理工具都支持通过正则表达式进行模式匹配 1.1 常规匹配 一串不包含特殊字符的正则表达式,匹配包含它自己的字符,例如: [root@bigdata001 ~]# cat /etc/passwd | grep root root:x:0:0:r

随机推荐