您的位置:首页 > 运维架构 > Linux

Unix & Linux 笔记(10)

2016-05-27 16:10 441 查看

第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
的变体:
fgrep
egrep

grep –E


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

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

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


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

19.5 使用
look
grep
的时机

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 改变第二个文件的联接字段


field1
field2
是引用特定字段的数字,
file1
file2
是有序数据文件。当
join
读取输出时,忽略前导空白符。
joi
n假定各个字段之间用空白符分隔。当基于匹配的字段组合两组数据时,称之为联接,用来匹配的具体字段称为联接字段(
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的字符在输入序列中存在连续的


重复,在替换时会被统一缩为一个字符的长度

其中
set1
set2
是字符数组。注意该语法并不要求指定输入和输出文件名,这是因

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 转换不可显示字符

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

OSEND
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: