一、 * 各种文本 处理工具
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 f 2
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
输出 结果为: 5 c5 注 :第 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
作用 :文本搜索工具,根据用户指定的 “ 模式 ” 对目标 文件逐行进行匹配检查;打印匹配到行:
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 (
Per
l
Compatible Regular
元字符 分类:字符匹配、匹配次数、位置锚定、分组
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] … '
4.1 常用选项
-n :不输出模式空 间内容到屏幕,即不自动打印 ; -e: 多点编 辑;多次编辑
-f :
/ PATH/
-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 编辑命令
’
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 所有内容,并再打印第二行显示
v sed – n ‘ 2p ’ /etc/passwd 仅显示 /etc/passwd 文本第 2 行的内容
v sed – n ‘ 1,4p ’ /etc/passwd 仅显示 /etc/passwd 文本第 1-4 行的内容
v sed – n ‘ /root/p ’ /etc/passwd 仅显示 /etc/passwd 文本含有 root 行的内容
v sed – n ‘ 2,/root/p ’ /etc/passwd 仅显示 /etc/passwd 文本从第 2 行随后第一个匹配到 root 的行
v sed -n ‘ /^$/= ’ file 仅显示 file 文本空行行号
v sed – n – e ‘ /^$/p ’ – e ‘ /^$/= ’ file 仅显示空白行和空白行号
v sed ‘ /root/a\superman ’ /etc/passwd 行后 在 /etc/passwd 文本含有 root 的行行后显示 superman
v sed ‘ /root/i\superman ’ /etc/passwd 行前 在 /etc/passwd 文本含有 root 的行行后显示 superman
v sed ‘ /root/c\superman ’ /etc/passwd 代替行 在 /etc/passwd 文本含有 root 的行替换为 superman
v sed ‘ /^$/d ’ file 显示 file 中的非空白行
v sed ‘ 1,10d ’ file 显示 file 文本中除 1-10 行的所有的行
v nl /etc/passwd | sed ‘ 2,5d ’ 显示 /etc/passwd 文本中除 2-5 行外所有的行和行号
v nl /etc/passwd | sed ‘ 2a tea ’ 显示 /etc/passwd 文本中所有行号及文本,并在第 2 行后插入 tea
v sed '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
v sed -e ‘ s/dog/cat/ ’ -e ‘ s/hi/lo/ ’ pets 把 pets 文本每一行第一个匹配的 dog 换成 cat ; hi 换成 lo
v sed -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 仅显示奇数行