Unix & Linux 笔记(10)

第19章 过滤器:选取、排序、组合及变换

19.1 选取包含特定模式的行:grep

grep
re = regular expression ed中的搜索 g/re/pgre
grep [-cilLnrsvwx] patter [file...]

19.2 最重要的grep选项

-c count,统计所抽取行的数量 -i 忽略大小写 -n 在输出行前加上行号 -l list filename,当不只在一个文件中搜索时,结果列举文件名 -L 与-l相反,列举不包含匹配模式的文件名 -w 指定只希望搜索完整的单词 -v reverse,选取不包含指定模式的所有行 -x 完全由搜索模式构成的行 -r recursive,搜索整个目录树 -s suppress,忽略错误消息

19.3 grep的变体:fgrepegrep

grep –E

19.4 选取以特定模式开头的行:look

look搜索以字母顺序排列的数据,并查找所有以特定模式开头的行。look的使用方式有两种,一种用一个或多个文件中的有序数据,另一种就是让look搜索一个字典。

look [-df] patter file...
-d dictionary,只考虑字母和数字,忽略标点和其他特殊符号 -f fold,忽略大小写

look不能从标准输入中读取数据,它必须从一个或多个文件中获取输入,不能严格的被称为过滤器。(look采用“二分查找法”,怎么可能一行一行的读取数据!)

19.5 使用lookgrep的时机

look的三个限制:

a) 要求有序输入;
b) 只能从文件中读取数据,不能从标准输入中读取数据;
c) 只能在行的开头搜索指定的模式。

建议,凡事先考虑look。基于简单性和易用性选择工具,而不必在意速度或效率上的微小差别。当编写程序(包括shell脚本)时,这尤为重要。如果程序或者脚本太慢,通常可以找到一两个影响速度的瓶颈,从而提高他们的速度。但是,如果程序的复杂或者难以使用的程度超出必要,那么从长远来看,他将浪费时间,相对于计算机时间来说,这样的代价更高。

19.6 查找以特定模式开头的所有单词:look

look patter
字典文件
dictionary file

spell -> aspell 显示文档中有但是字典文件中没有的单词清单。

aspell -c file

19.7 排序数据:sort

排序数据以及查看数据是否已经有序。

sort [-dfnru] [-o outfile] [infile...]

-o write result to outfile instead of standard output

19.8 控制数据排序的顺序:sort –dfnru

-d (字典)当数据中包含妨碍排序的字符(如标点符号)时使用该选项 -f fold,等同 -n 识别行开头或字段开头的数字,并按数字排序 -r reverse,反序 -u unique,查找相同的行,并将相同的行值留下一行

19.9 检查数据是否有序:sort –c

sort -c[u] [file]

-c cheak,不进行排序,只是检查数据是否有序 -u 配合-c,严格校验排序;不配合-c,则只输出一次排序结果

19.9 ASCII码:排序序列

American Standard Code for Information Interchange 美国信息交换标准码

数字 意义
32 space
48-57 数字0-9
65-90 大写字符
97-122 小写字母

19.11 区域设置和排序序列

locale -a
LC_COLLATE=C(POSIX)/en_US(zh_CN)

19.12 查找重复行:uniq

uniq [-cdu] [infile [outfile]]
-c 统计重复行出现的次数 -d 只查看重复行 -u 只查看唯一行 uniq file 生成包含该文件的所有行,但没有重复行输出

19.13 合并两个文件中的有序数据:join

基于特定的字段的值将两个有序文件组合在一起。

join [-i] [-a1 | -v1] [-a2 | -v2] [-l field1] [-2 field2] file1 file2
-i 忽略大小写 -a all,输出第1/2个文件中的所有record,即使没有匹配 -v reverse,查看不匹配的行 -1 field 改变第一个文件的联接字段 -2 field 改变第二个文件的联接字段

field1field2是引用特定字段的数字,file1file2是有序数据文件。当join读取输出时,忽略前导空白符。join假定各个字段之间用空白符分隔。当基于匹配的字段组合两组数据时,称之为联接,用来匹配的具体字段称为联接字段(join field)。join,默认联接字段每个文件的第一个字段。

当以常规方式使用join(没有-a选项)时,所获得的结果称为内联接(inner join),对于内联接来说,输出只包含联接字段匹配的行。当使用-a1-a2时。输出还包含联接字段不匹配的行,称之为外联接(outer join)。

19.14 由偏序创建全序:tsort

tsort
topological sort 拓扑排序,对不完全排序的文件实行完整的列表排序,如果不指定文件,或者文件为”-“,则从标准输入读取数据。
偏序
partial ordering
全序
total ordering
tsort [file]
file,输入的每一行必须包含一对由空白符分隔的字符串,每一对字符串都代表一个偏序。

19.15 在二进制文件中搜索字符串:strings

大多数情况下,Unix的过滤器都是为处理文本文件设计的。strings就是为了让程序员显示嵌在在可执行程序和对象文件中的字符串。

strings [-length] [file...]

length是要显示的字符串的最小长度,默认抽取至少4个字符长的字符串。

19.16 转化字符:tr

tr
translate

a) 将字符改变成其他字符
b) 字符连续出现时,用一根字符替换,又称为挤压(squeeze)字符
c) 删除指定的字符

tr [-cds] [set1 [set2]]
-c complement首先补足set1
-d delete删除匹配set1的内容,并不作替换
-s squeeze如果匹配于set1的字符在输入序列中存在连续的

重复,在替换时会被统一缩为一个字符的长度
其中set1set2是字符数组。注意该语法并不要求指定输入和输出文件名,这是因
tr是一个纯过滤器。

tr 0-9 A-J < old > new
tr [:digit:] A-J < old > new
tr abcde Ax < old > new
tr abcde Axxxx < old > new

19.17 转换不可显示字符

各个操作系统如何标记行末

OS END
Unix ^J
Windows ^M^J

Macintosh OSX之前用^M,之后用^J

tr '\r' '\n' < macfile > unixfile

特殊代码

代码 名称 控制键
\b 退格 ^H
\t 制表符 ^I
\n 新行换行 ^J
\r 回车 ^M
\\ 反斜线 -

19.18 转换字符:高级话题

tr [-cds] [set1 [set2]]
-s选项告诉tr第一组中的多个连续字符应该替换为一个单独的字符(挤压字符)。
tr -s '' '' < olddata > newdata

将连续的空格替换为一个单独的空格而不改变其他字符。

  • -d选项删除指定的字符,仅需定义一组字符
  • -c匹配所有1第一组中的字符
tr -c ' \n' X < olddata > newdata

保留原文本的映像
统计一组输入文件中的所含单词的数量:

cat file... | tr -cs [:alpha:]\' ""\n"" | sort –fu | wc –l

保存单词列表

cat file... | tr -cs [:alpha:]\' ""\n"" | sort –fu > file

19.19 非交互文本编辑器:sed

sed stream editor  流编辑器

只谈简单的替换。

sed [-i] command | -e command... [file...]
-i in-place,sed将输出保存在一个临时文件,编辑结束后替换原文件
sed 's/a/A/g' names > newnames

重要原则:
在进行重要永久性改变之前,尽可能地事先预览结果。

19.20 使用sed进行替换

sed的功能来自于让它进行的操作。

[/address | patter/]s /search/replacement/[g]
  • address是输入流中一个或多个行的地址,
  • patter是一个字符串,
  • rearch是正则表达式,
  • replace是替换文本。

默认情况下,sed只改变每一行第一个出现的匹配字符串,所以要在命令的末尾加上g

sed -i 's/[mM]on/Monday/g' calendar
Windows的文本文件在 Unix中的转换
不能使用 tr,因为需要将两个字符改成一个字符, tr只能将一个字符变成另一个字符。只需查找并删除^M即可。
sed 's/.$//' winfile > unixfile

19.21 告诉sed只对指定行进行操作

对特定行进行操作。地址语法

number[,number] | /regex/

第一种,根据行号判读处理的行

sed '5s/a/A/g' names
sed '5,$s/a/A/g' names

第二种,使用正则表达式或者被斜线字符包围的字符串

sed '/[0-9][0-9]/s/a/A/g' names
sed '/OK/s/a/A/g' names

19.22 使用非常长的sed命令

编写脚本存储于文件instruction中,使用文件input中的数据。用-f命令标识程序文件。

sed -f instructions input

脚本暂时不会
sed一次执行多个操作,使用-e选项(editing command)。

sed -i –e 's/mon/Monday/g' -e 's/tue/Tuesday/g' calendar

你可能感兴趣的:(Unix & Linux 笔记(10))