一、*各种文本处理工具
1.1抽取文本的工具
1.1.1 cat、less查看文本内容
more、less和cat 【选项】 【文件】
cat –n ,-d列行 ,-A:显示所有看不见的符号(控制符),
-E:显示结尾$ ;-s:压缩连续空行为一行
more –d:显示翻页及退出提示
less:一页一页查看文件或标准输出
/文本:搜索文本 n/N:跳到下一个 或上一个匹配
1.1.2 head、tail文件截取
head和tail 【选项】 【文件】
head –c #:指定获取前#个字节 ; -n #;-#:指定获取前#行
tail –c #:指定获取后#字节 ; -n #;-#:指定获取后#行
-f:跟踪显示文件新追加的内容。常用于日志监控
例如:tail –n0 –f f2 & 后台显示跟踪日志 fg 1打断
1.1.3 cut、paste按列抽取
cut 和 paste 合并文件:【选项】 【文件】
cut -d:指明分隔符,默认为tab;常与-f一起使用;-c:按字符切割
-f #:第#个字段; –f #,#:离散的多个字段,例如1,3,6
-f #-#:连续的多个字段,例如1-5 ;混合使用:1-3,7
paste:合并两个文件同行号的列到一行
-d:指明分隔符,默认为tab ;-s:所有行合成为一行显示
paste f1 f2 ;paste –s f1 f2
1.1.4 wc、sort分析文本的工具
wc、sort 、diff和patch
文本数据统计:
wc -l:统计行数 ; -w:统计单词总数 ;-c:统计字节数
文本排序:sort 【选项】 files
sort -r:执行反方向(由上至下)整理 -n:执行按数字大小整理
-f:忽略字符串中的字符大小写 -u:删除输出中的重复行
-t c:选项用c作为字符界定符 -k X:c字符分隔的X列整理 常用-t -k 一起使用排序
1.1.5 uniq文本压缩工具
uniq 【选项】 【file】
uniq –c:显示每行重复出现的次数 ; -d:仅显示重复过的行
-u:仅显示不重复的行 注:连续且完全相同的方为重复。
常与sort命令一起使用 :sort userlist.txt | uniq -c
1.1.6 diff、patch比较文件间的区别
例如: $ diff foo.conf-broken foo.conf-works
输出结果为:5c5 注:第5行有改变
< use_widgets =no ; > use_widgets =yes
diff命令的输出被保存在一种叫做“补丁”的文件中;使用
diff -u:输出“统一的(unified)”diff格式文件,最适用于补丁文件。
patch :命令复制在其他文件中进行的改变(要谨慎使用!)
patch -d:自动备份改变了的文件
例如: $ diff –u foo.conf-broken foo.conf-works > foo.patch
$ patch -b foo.conf-broken foo.patch
reset:重置,重生成
二、Linux文本处理三剑客
grep、sed、awk
sed:stream editor,文本编辑工具
awk:Linux上的实现gawk,文本报告生成器
grep:文本过滤(模式:pattern)工具
2.1 grep文本过滤工具
grep:Grobal search Regular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文件逐行进行匹配检查;打印匹配到行:
grep 【选项】pattern 【file】
-n:搜索并显示所在文本内容的行号; -o:只显示匹配到的字符; –i:忽略字符的大小写
-v:只显示不能被pattern匹配到的行; –e:表示或者,实现多个逻辑关系如grep –e “cat” –e “ls” file
-c:计算查找“字符串”的次数; –A #:after,后#行 ;-B #:before,前#行 ;-C:context,前后各#行
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不代表字符表面的意义,而表示控制
或通配的功能;程序支持:grep、vim、less、nginx
正则表达式引擎(man 7 regex)
采用不同的算法,检查出路正则表达式的软件模块PCRE(Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组
2.1.1字符匹配(文本内容)
.:匹配任意单个字符 []:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符 [^/]+/?$:取基名
2.1.2匹配多次
*:匹配符号*前面字符任意次,包括0次 .*:匹配任意长度的任意字符,不包括:等特殊符号
\?:匹配前面的字符0次或者1次 \+:匹配前面的字符至少1次
gooo*gle 相当于 goo\+gle
\{n\}:匹配前面的字符n次 \{m,n\}:匹配前面的字符【m,n】次
\{1,\}相当于\+
2.1.3位置锚定
^:行首锚定(开头的行) $:行尾锚定(结尾的行) ^$:空行 ^[[:space:]]*$:空白行
\<:单词限定词首; \>:单词限定词尾 \<pattern\>:匹配整个单词
分组:\(\)将一个或多个字符捆绑在一起
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …
\1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
实例: \(string1\+\(string2\)*\) (\1|\2 ) \1: string1\+\(string2\)* \2: string2
后向引用:引用前面的分组括号中的模式所匹配字符 : \(r..t).*\(r..t\) 与\(r..t).*\1 是不同的
字母字符串后面如果有数字和下划线那就锚定不了
转义:\. 就表示.字符,而不是代表任意字符
三、*正则表达式
egrep及扩展的正则表达式 ;与grep功能差不多,就是正则表达式少了\。
或者: a|b:a或者b ; C|cat: C或者cat ;(C|c)at:Cat或者cat
3.1 文件名通配符
*:匹配零个或多个字符 ; ?:匹配任何单个字符; ~:当前用户家目录; ~mage:用户mage 家目录
~+ :当前工作目录 ~—: 前一个工作目录
[0-9] 匹配数字范围; [a-z] :字母; [A-Z] :字母 ; [wang] 匹配列表中的任何的一个字符
v [^wang] 匹配列表中的所有字符以外的字符
预定义的字符类:(#man 7 glob)帮助文件
[:digit:] :任意数字,相当于0-9 ; [:lower:] :任意小写字母
[:upper:]: 任意大写字母 ; [:alpha:]: 任意大小写字母
[:alnum:] :任意数字 或字 ; [:blank:] :水平空白字符 ; [:space:]:水平或垂直的空白字符
四、*sed 行编辑器
sed介绍、sed用法、sed高级用法
stream EDitor, 行编辑器 ,自带一些编程语言 ,可以直接对文件修改,故一般用管道传递给sed
v sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed 主要用来自动编辑一个或多个文件, 简化对文件的反复操作, 编写转换程序等。
用法:sed [option] … 'script' inputfile… 支持正则表达式
4.1常用选项
-n :不输出模式空间内容到屏幕,即不自动打印 ; -e: 多点编辑;多次编辑
-f :/ PATH/SCRIPT_FILE : 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式 ; -i: 原处编辑,直接修改建议-i.bak,先备份.bak后 (显示修改的内容,修改 前的内容在file.bak中)
4.2 script ' 地址命令'
地址定界: (一般加上-n,要不然显示2遍)
(1) 不给地址:对全文进行处理
(2) 单地址: #: 指定的行 ; /pattern/ :被此处模式所能够匹配到的每一行
(3) 地址范围:
#1,#2:从第#1行到#2行 ; #,+# ; /pat1/,/pat2/:匹配到part1到part2之间的行显示
#,/pat1/ :匹配第#行到匹配part之间行的显示
~ :步进 1~2 显示奇数行 2~2 显示偶数行
4.3 编辑命令
’script’ 地址定界用在’script前’
d: 删除模式空间匹配的行; 例如:‘ d‘删除有空格的行 ,也可以用全局替换
p: 显示模式空间中的内容 , -n ‘10P’:仅显示第10行,相当于head -10|tail -1;
(没有-n的话,模式空间所有的文本都显示,10行出现2次);
a [\]text :在指定行 后面追加文本 \n,可以追加两行至几行 ;支持 使用\n 实现多行追加
cat -n /etc/passwd | sed ‘10a\wwwww\nrrrrrr’ 显示/ect/passwd文本,并在第10行后面插入wwwww 两行
i [\]text :在行前面 插入文本 ;与上述差不多不过是第10行行前插入。 rrrrr
c [\]text :替换行为单行或多行文本 ;与上述差不多不过是替换第10行插入。
w /path/somefile: 保存模式匹配的行至指定文件
cat -n /etc/passwd | sed ‘10,15w f2’显示/etc/passwd内容,但是把10-15行的内容写到f2中去。
r /path/somefile :读取指定文件的文本至模式空间中匹配到的行后面
cat -n /etc/passwd | sed ‘10,15r f2’显示/etc/passwd内容,并在10-15行每一行后面插入显示f2的内容。
cat -n /etc/passwd | sed -n ‘10,15r f2’,仅显示/etc/passwd文本10-15行每行后面插入显示f2的文本内容。
=: 为模式空间中的行打印行号 ; cat f1 |sed -n '/root/=' 仅显示f1文本中含有root的行号
cat f1 |sed '/root/=' 显示f1文本内容 ,并在root所在行上面显示行号
!: 模式空间中匹配行取反处理 ;cat f1 |sed -n '/root/!=' 仅显示f1文本中不含有root的行号
cat f1 |sed '/root/!=' 显示f1不含有root行的文本内容 ,并在显示的所在行上面显示行号
4.4 查找替换
s/// :查找替换, 支持使用其它分隔符,s@@@ ,s### (不支持编辑命令)
cat /etc/passwd | sed ‘s/root/ROOT/’:把/etc/passwd文本中每一行第一个匹配到的root 替换为ROOT
v 替换标记: g: 行内全局替换 ;p: 显示替换成功的行
w /PATH/TO/SOMEFILE :将替换成功的行保存至文件中
4.5 sed普通命令示例
sed ‘2p’ /etc/passwd 显示/etc/passwd 所有内容,并再打印第二行显示
vsed –n ‘2p’ /etc/passwd 仅显示/etc/passwd 文本第2行的内容
vsed –n ‘1,4p’ /etc/passwd 仅显示/etc/passwd 文本第1-4行的内容
vsed –n ‘/root/p’ /etc/passwd 仅显示/etc/passwd 文本含有root行的内容
vsed –n ‘2,/root/p’ /etc/passwd 仅显示/etc/passwd 文本从第2 行随后第一个匹配到root的行
vsed -n ‘/^$/=’ file 仅显示file文本空行行号
vsed –n –e ‘/^$/p’ –e ‘/^$/=’ file 仅显示空白行和空白行号
vsed ‘/root/a\superman’ /etc/passwd 行后 在/etc/passwd文本含有root的行行后显示superman
vsed ‘/root/i\superman’ /etc/passwd 行前 在/etc/passwd文本含有root的行行后显示superman
vsed ‘/root/c\superman’ /etc/passwd 代替行 在/etc/passwd文本含有root的行替换为superman
vsed ‘/^$/d’ file 显示file中的非空白行
vsed ‘1,10d’ file 显示file文本中除1-10行的所有的行
vnl /etc/passwd | sed ‘2,5d’ 显示/etc/passwd文本中除2-5行外所有的行和行号
vnl /etc/passwd | sed ‘2a tea’ 显示/etc/passwd文本中所有行号及文本,并在第2行后插入tea
vsed 's/test/mytest/g' file 替换file文本中test为mytest
sed -n‘s/root/&superman/p’ /etc/passwd 单词后:仅显示/etc/passwd文本中root的行并把root替换为rootsuperman
sed -n ’s/root/superman&/p’/etc/passwd 单词前:仅显示/etc/passwd文本中root的行并把root替换为supermanroot
vsed -e‘s/dog/cat/’-e ‘s/hi/lo/’pets 把pets文本每一行第一个匹配的dog换成cat ;hi换成lo
vsed -i.bak‘s/dog/cat/g’pets 备份pets文本为pets.bak,并把pets文本中dog全部替换成cat显示出来
4.6 sed 工具
v 高级编辑命令:(模式空间,保持空间)
h: 把模式空间中的内容覆盖至保持空间中
H :把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G :从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行 覆盖 至模式空间
N :读取匹配 到的行的 下一行 追加 至 模式空间
d: 删除模式空间中的行
D :删除 当前模式空间开端至\n 的内容 ( 不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
4.7 sed高级编辑命令示例
v sed -n 'n;p' FILE 仅显示file的偶数行
v sed '1!G;h;$!d' FILE 把file文本倒叙显示 相当于tac file
v sed '$!N;$!D' FILE 显示file文本最后2行 相当于tail -2
v sed '$!d' FILE 仅显示file文本最后1行 相当于tail -1
v sed ‘G’ FILE 保持模式先为空的 ;追加到模式空间 ;就会形成模式空间每行之间有空格,再显示出来
v sed ‘g’ FILE 保持模式先为空的 ;覆盖模式空间 ;就会形成模式空间都为空格,再显示出来一片空白
v sed ‘/^$/d;G’ FILE 显示除空格之外的偶数行
v sed 'n;d' FILE 仅显示奇数行
原创文章,作者:lyx,如若转载,请注明出处:http://www.178linux.com/60550