Shell脚本中常用的文本过滤命令

Posted 老薛Linux大讲堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本中常用的文本过滤命令相关的知识,希望对你有一定的参考价值。

       在Linux运维日常工作中,Shell脚本的使用如家常便饭一样,须做到顺手拈来,文本处理所占比重更是不容小视,而文本处理中,稍具难度的莫过于文本的过滤。今天我们要通过这一讲,掌握文本过滤的常用命令,有哪些呢?具体如下:
1)head
作用:提取文本文件的前几行
格式:head  -数字  文本文件
实例:
--查看/etc/passwd/文件的前3行
#head  -3  /etc/passwd

2)tail
作用:提取文本文件的末尾几行
格式:tail +数字/-数字/-f   文本文件
实例:
--查看/etc/passwd文件中的最后5行
#tail  -5  /etc/passwd
--查看/etc/passwd文件的第10行到最后一行的内容
#tail  +10  /etc/passwd
--监视/vas/log/messages文件是否追加了内容
#tail  -f  /var/log/messages

3)grep
作用:在文本文件中提取匹配的行
格式:grep  [参数] "字符串/正则表达式"  文本文件
参数:
-c 只显示匹配的行的个数,不显示行的内容
-q 只显示查找状态,不显示行的内容
-v 查找不匹配的行
-n 在显示行前标上在文档中的行号
-w 完全匹配
-i 模式匹配时忽略大小写
正则表达式元字符:
^
锚定行的开始 如:'^grep'匹配所有以grep开头的行
$
锚定行的结束 如:'grep$'匹配所有以grep结尾的行
.
匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p
*
匹配零个或多个先前字符 如:' *grep'匹配所有一个或多个空格后紧跟grep的行。
.*一起用代表任意字符
[...]
匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep
[^...]
匹配一个不在指定范围内的字符
\(..\)
标记匹配字符,如'\(love\)',love被标记为1
\<
锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行
\>
锚定单词的结束,如:'grep\>'匹配包含以grep结尾的单词的行
x\{m\}
重复字符x,m次,如:'0\{5\}'匹配包含5个0的行
x\{m,\}
重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行
x\{m,n\}
重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5-10个o的行
实例:
--在/etc/passwd文件中查找包含字符串root的行并显示
#grep  "root"  /etc/passwd
--在/etc/passwd文件中查找以a/b/d开头的行并显示行内容
#grep  "^[abd]"  /etc/passwd
--统计/etc下以d开头的行数
#ls -l /etc | grep -c "^d"

4)sort
作用:对文本文件进行排序并输出
格式:sort [参数]  文件路径
-f 忽略大小写
-t 指定字段分隔符
-r      降序排列
-n      按数字大小排列
-u 消除重复行
实例:
--输出/etc/passwd文件内容并排序
#sort  /etc/passwd
--对/etc/passwd文件按第三字段排序,以:号字段分隔符,并以数字升序排列
--sort  -t: -n  +2 -3  /etc/passwd
5)uniq
作用:去除文本文件中重复内容并输出
格式:uniq  [参数]  文本路径
-u 输出未重复的内容
-d 输出重复的内容
实例:
--显示/abc/a1文件内容,去除重复,重复的行只显示一行
#uniq  /abc/a1
--显示/abc/a1的未重复内容,重复的行全都不显示
#uniq  -u  /abc/a1
--只显示/abc/a1的重复内容,重复的行只显示一行
#uniq -d  /abc/a1
注:经常结合sort与uniq
如:#sort  /abc/a1 | uniq

6)sed
作用:Sed(a stream editor)是一种流线型、非交互式编辑器。用可利用命令来编辑文件内容并输出
格式:sed  [参数] '子命令'  文件路径
-n 关闭默认显示
-e 多次编辑
子命令:
-p 显示匹配的行
-a 在指定行的后面添加新行
-i 在指定行的前面添加新行
-d 删除匹配的行
-s 修改匹配的行
-r 将指定文件的内容读到当前文件匹配的行的下面
-w 将匹配的内容写到指定的文件中
-y 传送字符,变换字符
-n 读取下一行
-{...} 对匹配的行执行命令组
-q 退出sed
-b 标记 //跳到标记位置
-t 标记 //如果某行发生修改,则跳到指定位置
-T 标记 //如果某行未发生修改,则跳转到指定位置
实例:
-->打印命令:p
--显示/etc/passwd下包含root的行
#sed  -n  '/root/p' /etc/passwd
--显示/etc/passwd下2到15的行
#sed  -n  '2,15p'  /etc/passwd
--显示/etc/passwd下2到末尾的行
#sed  -n  '2,$p'  /etc/passwd

-->删除命令:d
--删除/etc/passwd下以u1开头的行,其余行输出到屏幕
#sed  '/^u1/d' /etc/passwd
--删除/etc/passwd中的第9行,其余行输出到屏幕
#sed  '9d' /etc/passwd
--删除/etc/passwd下含有u1的行,其余行输出到屏幕
#sed  '/u1/d'  /etc/passwd

-->修改命令:s
--将/etc/passwd中所有的root修改为admin,并输出
#sed  's/root/admin/g'  /etc/passwd
--将/etc/passwd中第一行到第五行的root修改为admin,并输出
#sed  '1,5s/root/admin/g' /etc/passwd

-->在指定行的后面添加新行:a
--在/etc/passwd中第3行下面插入一行“linux system”
#sed  '3a \linux system' /etc/passwd

-->在指定行的前面添加新行:i
-在/etc/passwd中第3行前面插入一行“linux system”
#sed  '3i \linux system' /etc/passwd

-->将指定文件的内容读到当前文件匹配的行的下面:r
--将/abc/a1的内容读到/abc/a2第5行的下面
#sed  '5r /abc/a1'  /abc/a2

-->将匹配的内容写到指定的文件中:w
--将/etc/passwd下包含root的行写到/abc/root.txt中
#sed  -n  '/root/w  /abc/root.txt' /etc/passwd

-->传送字符,变换字符:y
--将/abc/a1第2行到第5行的a变为大写A
#sed  '2,5y/a/A/' /abc/a1

-->退出:q
--在打印了5行之后,用q命令退出sed程序。
#sed '5q'  /etc/passwd

8)tr
作用:替换或删除文件中的指定字符
格式:tr [参数] 字符串1  字符串2  文件路径
-c 替换字符
-d 删除字符
-s 替换字符串1   字符串2
字符范围:
[A-Z]
[a-z]
[0-9]
[0*n]    //表示字符0重复出现指定次数n
如:[0*2]匹配00的字符串
\octal
控制字符:
\a 铃声
\b 退格符
\n 新行
\r 回车
\t tab键
通配字符:
[:alnum:] 所有字母和数字
[:alpha:] 所有字母
[:lower:] 所有小写字母
[:upper:] 所有大写字母
[:digit:] 所有数字
[:blank:] 所有空行
[:space:] 所有空格
[:graph:] 所有可显示的字符,不包含空格
[:print:] 所有可显示的字符,包括空格
[:cntrl:] 所有控制字符
[:punct:] 所有标点符号字符
[:xdigit:] 所有十六进制数字
实例:
--去除/abc/a1中的换行符
#tr -d  '\n\r' < /abc/a1
--修改/abc/a1中所有abc为123
#tr 'abc' '123' < /abc/a1
--修改/abc/a1中所有小写字母为大写字母
#tr [:lower:] [:upper:] < /abc/a1

以上是关于Shell脚本中常用的文本过滤命令的主要内容,如果未能解决你的问题,请参考以下文章

Linux shell脚本基础

shell脚本基础

Shell基本脚本命令使用教程

Linux系统shell脚本之过滤文本关键字

Shell脚本——使用sed命令编辑文本

详解Shell脚本:sed命令工具 ,awk命令工具