Linux系统中: shell的文本处理( grep / sed / awk)
######1.grep文本过滤明令######
全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模式”对目标文本进行匹配检查 ,打印匹配到的行。
由正则表达式或者字符及基本文本字符所编写的过滤条件。
###1.grep的格式###
grep 匹配条件 处理文件
###2.grep中字符的匹配位置设定###
^ 关键字 ##以 “关键字”开头
关键字 $ ##以 “关键字”结尾
\< 关键字 ##“关键字”前没有字符
关键字 \> ##“关键字”后没有字符
\< 关键字 \> ##“关键字”前后均没有字符
grep -i ##忽略大小写
###3.grep的正则表达式###
1)grep r... file ##以r开头的任意3个字符的行
2)grep r...t file ##以r开头、t结尾的,并且中间有任意3个字符的行
3)grep ...t file ##以t结尾的,前面有3个字符的行
###4.grep 正则表达式与扩展正则表达式###
正规的 grep 不支持扩展的正则表达式,
竖线是用于表示“或”的扩展正则表达式字符,正规的 grep 无法识别
加上反斜杠,这个字符就被翻译成扩展正则表达式,就像 egrp和grep -E 一样
###5.grep 中字符的匹配次数设定###
.* ##关键字之间匹配任意字符
* ##字符出现 [0- 任意次 ]
\? ##字符出现 [0-1 次 ]
\+ ##字符出现 [1- 任意次 ]
\{n\} ##字符出现 [n 次 ]
|{m,n\} ##字符出现 [ 最少出现 m 次,最多出现 n 次 ]
\{0,n\} ##字符出现 [0-n 次 ]
\{m,\} ##字符出现 [ 至少 m 次 ]
\(xy\)\{n\}xy ##关键字出现 [n 次 ]
* ##字符出现 [0- 任意次 ]
\+ ##字符出现 [1- 任意次 ]
\{n\} ##字符出现 [n 次 ]
|{m,n\} ##字符出现 [ 最少出现 m 次,最多出现 n 次 ]
\{0,n\} ##字符出现 [0-n 次 ]
\{m,\} ##字符出现 [ 至少 m 次 ]
\? ##字符出现 [0-1 次 ]
######2.sed行编辑器######
用来操作纯 ASCII 码的文本
处理时,把当前处理的行存储在临时缓冲区中,称为“模式间” (patternspace),可以指定仅仅处理哪些行
sed 符合模式条件的处理,不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行,这样不断重复,直到文件末尾
调用sed 命令格式:
有两种形式:
sed [options] ' command ' file(s)
sed [options] -f scriptfile file(s)
###1.p 模式操作###
sed -n '/\:/p' file ##显示以:隔开的行,不复制
sed -n '/ xxx$ /p' file ##显示以xxx结尾的行,不复制
sed -n '/ ^xxx /p' file ##显示以xxx开头的行,不复制
sed -n '2,6p' file ##显示第2行至第6行,不复制
sed -n '2,6!p' file ##显示除了第2行至第6行以外的行,不复制
sed -n '/\:/p' xxx ##显示以:隔开的行
sed -n /^#/p xxx ##显示以#开头的行
sed -n '/^#/!'p xxx ##显示除了以#开头的行
cat -b xxx ##跳过空行显示行号
cat -n xxx ##包括空行显示行号
cat -n xxx | sed -n '6p' ##显示第6行
cat -n xxx | sed -n '2,6p' ##显示第2行至第6行
cat -n xxx | sed -n -e '2p' -e '6p' ##显示第2行和第6行
cat -n xxx | sed -n -e '2p;6p' ##显示第2行和第6行
###2. d 模式操作###
sed '/^xxx/d' file ##删除以xxx开头的行,并显示
sed '/^xxx/!d' file ##删除除了以xxx开头的行之外的行,并显示
sed '/xxx $/d' file ##删除以xxx结尾的行,并显示
sed '1,4d' file ##删除第1行至第4行,并显示
sed –n '/^xxx/d' file ##删除以xxx开头的行,不显示
sed '/^xxx/d' ##删除以xxx开头的行,并显示
sed '/^xxx/!d' ##删除除了以xxx开头的行之外的行,并显示(只保留以xxx开头的行)
sed –n '/^xxx/d' ##删除以xxx开头的行,不显示
cat -n xxx | sed '4d' ##删除第4行,并查看
cat -n xxx | sed '4,6d' ##删除第4行至第6行,并查看
cat -n xxx | sed -e '4d;6d' ##删除第4行和第6行,并查看
###3.a 模式操作###
sed '/^xxx/a \hello westos' file ##添加hello westos到以xxx开头的行的下一行
sed '/^xxx/a \hello \nwestos' file ##添加[hello换行westos]到以xxx开头的行的下一行
sed 'axxx' ##添加xxx到每一行的下一行
###4. i 模式操作###
sed '/^xxx/i\hello \nwestos' file ##插入[hello换行westos]到以xxx开头的行的上一行
###5. c 模式操作###
sed '/^xxx/c\hello \nwestos' file ##用[hello换行westos]替换以xxx开头的行
###6. w 模式操作###
sed '/^xxx/w file1' file ##将以xxx开头的行导入到一个新文件中,并显示
sed -n '/^xxx/w file1' file ##将以xxx开头的行导入到一个新文件中,不显示
###7. sed的其他用法###
sed '*/xxx' file ##将xxx文件里的内容插入到每一行的下一行
sed '6r*/xxx' file ##将xxx文件里的内容插入到第6行的下一行
sed '/^xxx/=' file ##显示以xxx开头的行的行号和所有内容
sed -n '/^xxx/=' file ##显示以xxx开头的行的行号,不显示内容
sed -n -e '/^xxx/p' -e '/^xxx/=' file ##显示以xxx开头的行的行号和内容
sed -nf file2 file ##执行file2文件中的条件,不复制原文件内容
sed ' = ' file ##在文件每一行的上一行插入行号
sed ' N;s/ \ n / /g' file ##将文件中显示的行号移至每一行前面,并空格
sed 's/^xxx/***/g' file ##将文件中所有的xxx替换成***,并显示
sed -e 's/xxx/***/g;s/###/+++/g' file ##将文件中所有的xxx替换成***和###替换成+++,并显示
sed 's/ \ / / # /' file ##将文件中的 / 替换成#,只替换第一个,并显示
sed '4s/xxx/***/g' file ##将第4行的xxx替换成***,并显示全文
sed '2,4s/xxx/***/g' file ##将第2行到第4行的xxx替换成***,并显示全文
sed '/###/,/+++/s/xxx/***/g' file ##将以###开头的行至以+++开头的行中的xxx替换成***,并显示全文
sed 's/ \ / / /g' file ##将文中的所有“ \ ”换为“ ”,并显示
sed '[email protected]/@ @g' file ##@和 / 是一个意思,为了方便区分使用
sed '[email protected]@***@g' file ##将文中的所有xxx换为***,并显示
sed 'G' file ##将文件中的每一行都空一行
sed '$!G' file ##除了最后一行后不空行外,其他的每一行都空一行
sed -n '$p' file ##显示最后一行
######3. awk报告生成器######
awk处理机制:逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作。
awk在命令格式上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行读入文本,执行相应的处理。是最常见的编辑指令块
END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果
###awk基本用法###
awk -F '{print FILENAME}' file ##将文件的所有行替换为file的名称,并显示
awk -F '{print 第 "NR" 行 }' file ##显示文中的所有行号
awk -F'{print 有 "NF" 列 }' file ##显示每一行的列数
awk 'BEGIN{print xxx}' file ##文件以xxx开头,并显示xxx
awk 'END{print ***}' file ##文件以***结尾,并显示***
awk -F : 'BEGIN{print xxx}{print $n}END{***}' file ##显示文件以xxx开头,第n列,以***结尾
awk '/bash$/' file
awk -F : '/bash$/{print $1}' file ##显示第1列的第1行
awk -F : '!/bash$/{print $1}' file ##显示除了第1列的第1行之外的所有行
awk 'BEGIN{a=34;print a+12}' ##显示34+12的结果
awk -F : '/^[a-d]/{print $1,$6}' passwd.txt
awk -F : '/^a|nologin$/{print $1,$7}' passwd.txt
awk -F : '$6~/bin$/{print $1,$6}'
awk -F : '$7!~/nologin$/{print $1,$7}' passwd.txt