grep
re = regular expression ed
中的搜索
g/re/pgre
grep [-cilLnrsvwx] patter [file...]
grep
选项-c count,统计所抽取行的数量 -i 忽略大小写 -n 在输出行前加上行号 -l list filename,当不只在一个文件中搜索时,结果列举文件名 -L 与-l相反,列举不包含匹配模式的文件名 -w 指定只希望搜索完整的单词 -v reverse,选取不包含指定模式的所有行 -x 完全由搜索模式构成的行 -r recursive,搜索整个目录树 -s suppress,忽略错误消息
grep
的变体:fgrep
、egrep
grep –E
look
look
搜索以字母顺序排列的数据,并查找所有以特定模式开头的行。look
的使用方式有两种,一种用一个或多个文件中的有序数据,另一种就是让look
搜索一个字典。
look [-df] patter file...
-d dictionary,只考虑字母和数字,忽略标点和其他特殊符号 -f fold,忽略大小写
look
不能从标准输入中读取数据,它必须从一个或多个文件中获取输入,不能严格的被称为过滤器。(look
采用“二分查找法”,怎么可能一行一行的读取数据!)
look
和grep
的时机look的三个限制:
a) 要求有序输入;
b) 只能从文件中读取数据,不能从标准输入中读取数据;
c) 只能在行的开头搜索指定的模式。
建议,凡事先考虑look
。基于简单性和易用性选择工具,而不必在意速度或效率上的微小差别。当编写程序(包括shell
脚本)时,这尤为重要。如果程序或者脚本太慢,通常可以找到一两个影响速度的瓶颈,从而提高他们的速度。但是,如果程序的复杂或者难以使用的程度超出必要,那么从长远来看,他将浪费时间,相对于计算机时间来说,这样的代价更高。
look
look patter
dictionary file
spell
-> aspell
显示文档中有但是字典文件中没有的单词清单。
aspell -c file
sort
排序数据以及查看数据是否已经有序。
sort [-dfnru] [-o outfile] [infile...]
-o write result to outfile instead of standard output
sort –dfnru
-d (字典)当数据中包含妨碍排序的字符(如标点符号)时使用该选项 -f fold,等同 -n 识别行开头或字段开头的数字,并按数字排序 -r reverse,反序 -u unique,查找相同的行,并将相同的行值留下一行
sort –c
sort -c[u] [file]
-c cheak,不进行排序,只是检查数据是否有序 -u 配合-c,严格校验排序;不配合-c,则只输出一次排序结果
ASCII
码:排序序列American Standard Code for Information Interchange 美国信息交换标准码
数字 | 意义 |
---|---|
32 |
space |
48-57 |
数字0-9 |
65-90 |
大写字符 |
97-122 |
小写字母 |
locale -a
LC_COLLATE=C(POSIX)/en_US(zh_CN)
uniq
uniq [-cdu] [infile [outfile]]
-c 统计重复行出现的次数 -d 只查看重复行 -u 只查看唯一行 uniq file 生成包含该文件的所有行,但没有重复行输出
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
)。
tsort
tsort [file]
file,输入的每一行必须包含一对由空白符分隔的字符串,每一对字符串都代表一个偏序。
strings
大多数情况下,Unix
的过滤器都是为处理文本文件设计的。strings
就是为了让程序员显示嵌在在可执行程序和对象文件中的字符串。
strings [-length] [file...]
length
是要显示的字符串的最小长度,默认抽取至少4个字符长的字符串。
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
各个操作系统如何标记行末
OS | END |
---|---|
Unix |
^J |
Windows |
^M^J |
Macintosh OSX
之前用^M
,之后用^J
tr '\r' '\n' < macfile > unixfile
特殊代码
代码 | 名称 | 控制键 |
---|---|---|
\b |
退格 | ^H |
\t |
制表符 | ^I |
\n |
新行换行 | ^J |
\r |
回车 | ^M |
\\ |
反斜线 | - |
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
sed
sed stream editor 流编辑器
只谈简单的替换。
sed [-i] command | -e command... [file...]
-i in-place,sed将输出保存在一个临时文件,编辑结束后替换原文件
sed 's/a/A/g' names > newnames
重要原则:
在进行重要永久性改变之前,尽可能地事先预览结果。
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
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
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