Shell正则表达式与文本处理器

一、grep

1. 正则表达式

是一种匹配字符串的方法,通过一些特殊符号,快速实现查找,删除,替换某特定字符串。

选项:
-a 不要忽略二进制数据。

-A  显示该行之后的内容。

-b 显示该行之前的内容。

-c 计算符合范本样式的列数。

-C  除了显示符合范本样式的那一列之外,并显示该列之前后的内容。

-d 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。

-e 指定字符串作为查找文件内容的范本样式。

-E 能使用扩展正则表达式。

-f 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。

-F 固定字符串的列表。

-G 普通的表示法来使用。

-h 不标示该列所属的文件名称。

-H 标示该列的文件名称。

-i 忽略字符大小写的差别。

-l 列出文件名称。

-L 列出内容不符合的文件名称。

-n 标示出该列的编号。

-q 不显示任何信息。

-R/-r 此参数的效果和指定“-d recurse”参数相同。

-s 不显示错误信息。

-v 反转查找。

-w 只显示全字符合的列。

-x 只显示全列符合的列。

-y 此参数效果跟“-i”相同。

-o 只输出文件中匹配到的部分。

2. 基础正则表达式

创建该文件,以该文件为例进行编辑。

[root@localhost ~]# vim txt 
he was short and fat.
he was weating a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
PI=3.14
a wood cross!
Actions speak louder than words

#woood #
#woooooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.

 (1)查看包含the的行

[root@localhost ~]# grep -ni 'the' txt     查找包含the的行

 备注:

  • -n 显示行号
  • -i  不区分大小写
  • -v  不包含指定字符

(2)利用[  ] 查找

[root@localhost ~]# grep -n 'sh[io]rt' txt

查找shirt和short,其中[ ]无论有几个字符,都匹配一个字符。即[io]匹配i或者o。

[root@localhost ~]# grep -n '[^w]oo' txt   查找oo前面非w的内容
[root@localhost ~]# grep -n '[a-z]oo' txt   查找oo前面是a-z的内容
[root@localhost ~]# grep -n '[0-9]' txt    查找0-9相关的内容

备注:
^ 在字母前,表示取反。
^ 在[  ] 前,表示以括号中的字符开头。

(3)查找行首行尾

[root@localhost ~]# grep -n '^the' txt    查找以the为行首的内容
[root@localhost ~]# grep -n '^[a-z]' txt  查询以小写字母开头的行
[root@localhost ~]# grep -n '^[A-Z]' txt   查询以大写字母开头的行
[root@localhost ~]# grep -n '^[^a-zA-Z]' txt  查询非字母开头的行

[root@localhost ~]# grep -n '\.$' txt   查询以 . 结尾的行
[root@localhost ~]# grep -n '^$' txt    查询空行 
[root@localhost ~]# grep -n -v '^$' txt  查询非空行

备注:
^ 行首;$ 行尾
^在[ ] 内表示反向选择;在[  ]前表示定位行首。

(4)查找任意字符和重复字符

[root@localhost ~]# grep -n 'w..d' txt   查询以d开头,w结尾的内容
[root@localhost ~]# grep -n 'ooo*' txt   查询至少包含两个字母00的内容
[root@localhost ~]# grep -n 'woo*d' txt   查询包含w字母开头,d结尾中间至少一个字母o
[root@localhost ~]# grep -n 'w.*d' txt  w开头,d结尾,中间字符可有可无
[root@localhost ~]# grep -n '[0-9][0-9]*' txt  查询包含数字的行

  备注:
  'w..d'  一个点只能代表一个字符
  ooo*:前两个o是条件,表示包含两个o;然后是o*,表示后面有零个或多个重复o。

(5)查询连续字符内容

[root@localhost ~]# grep -n 'o\{2\}' txt  查询包含两个o的字符
[root@localhost ~]# grep -n 'wo\{2,5\}d'txt  w开头,d结尾中间有2--5个o
[root@localhost ~]# grep -n 'wo\{2,\}d' txt  w开头,d结尾中间有2个以上o

二、sed 文本处理器

sed 的工作流程主要包括读取、执行和显示三个过程。

  • 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
  • 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
  • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

1. sed常用选项

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

2.sed常用操作

a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :替换,可以直接进行替换的工作
y:字符转换

3. 输出符合条件的文本


[root@localhost ~]# sed -n 'p' txt  输出所有内容
[root@localhost ~]# sed -n '3p' txt  输出第三行
[root@localhost ~]# sed -n '3,5p' txt  输出3~5行
[root@localhost ~]# sed -n 'p;n' txt  输出所有奇数行
[root@localhost ~]# sed -n 'n;p' txt  输出所有偶数行
[root@localhost ~]# sed -n '1,5{p;n}' txt  输出第1~5行之间的奇数行
[root@localhost ~]# sed -n '10,${n;p}' txt  输出第10行至文件尾之间的偶数行
[root@localhost ~]# sed -n '/the/p' txt  输出包含the的行
[root@localhost ~]# sed -n ' 4,/the/p' txt  输出从第4行开始至第一个包含the的行
[root@localhost ~]# sed -n '/the/=' txt  输出包含the的行所在的行号
注释:
=用来输出行号

[root@localhost ~]# sed -n '/^PI/p' txt  输出以PI开头的行
[root@localhost ~]# sed -n '/\<wood\>/p' test.txt 
或
[root@localhost ~]# sed -n '/wood/p' txt  输出包含单词wood的行

4. 删除符合条件的文本

[root@localhost ~]# nl txt | sed '3d'  显示行号
或
[root@localhost ~]# sed '3d' txt    不显示行号
[root@localhost ~]# nl txt |sed '3,5d'  删除3~5行 
[root@localhost ~]# nl txt |sed '/cross/d' 删除包含cross的行
[root@localhost ~]# nl txt |sed '/cross/! d'   删除不包含cross的行
[root@localhost ~]# sed '/^[a-z]/d' txt   删除以小写字母开头的行
[root@localhost ~]# sed '/\.$/d' txt   删除以点结尾的行
[root@localhost ~]# sed '/^$/d' txt   删除空行

5.替换符合条件的文本

[root@localhost ~]# sed 's/the/THE/' txt  将每行的第一个the换成THE
[root@localhost ~]# sed 's/l/L/2' txt  将每行中的第2个l换成L
[root@localhost ~]# sed 's/the/THE/g' test.txt 将文中所有的the换成THE
[root@localhost ~]# sed 's/o//g' txt  将文中所有的o删除
[root@localhost ~]# sed 's/^/#/' txt   在每行的行首插入#
[root@localhost ~]# sed 's/$/#/' txt  在每行行尾添加#
[root@localhost ~]# sed '/the/s/^/#/' txt   在包含the的每行的行首插入#
[root@localhost ~]# sed 's/$/EOF/' txt  在每行的行尾插入字符串EOF
[root@localhost ~]# sed '3,5s/the/THE/g' txt   将第3~5行中的所有the替换成THE
[root@localhost ~]# sed '/the/s/o/O/g' txt   将包含the的所有行中的o都替换成O

6. 迁移符合条件的文本

H:复制到剪切板
g:将剪切板中的内容覆盖到指定行
G:将剪切板中的内容追加到指定行
w:保存文件
r:读取指定文件
a:追加指定内容

[root@localhost ~]# sed '/the/{H;d};$G' txt  将包含the的行迁移至文件的末尾
[root@localhost ~]# sed '1,5{H;d};17G' txt   将第1~5行的内容转移至第17行后
[root@localhost ~]# sed '/the/w out.txt' txt  将包含the的行另存为文件out.txt
[root@localhost ~]# sed '/the/r /etc/hostname' txt   将文件/etc/hostname的内容添加到包含the的每一行后
[root@localhost ~]# sed '3a#chkconfig:35 82 20' txt  在第3行后插入一个新行,内容为#chkconfig:35 82 20
[root@localhost ~]# sed '/the/aNew' txt  (6)在包含the的每行后插入一个新行,内容为New
[root@localhost ~]# sed '3aNew1\nNew2' txt 在第3行后插入多行内容

注释:\n为换行,添加两行为New1和New2

 三、awk 文本处理器

       awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理。

1. awk 常见用法

$0           表示整个当前行
$1           每行第一个字段
NF          字段数量变量
NR          每行的记录号,多文件记录递增
FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始

2. 按行输出文本

awk -F":" '{print}' /etc/passwd					//输出所有
awk -F":" '{print $0}' /etc/passwd					//输出所有
awk -F: 'NR==3,NR==6{print}' /etc/passwd		 //显示第3行到第6行
awk -F: 'NR>=3&&NR<=6{print}' /etc/passwd       //显示第3行到第6行
awk -F: 'NR==3||NR==6{print}' /etc/passwd       //显示第3行和第6行
awk '(NR%2)==1{print}' /etc/passwd			//显示奇数行
awk '(NR%2)==0{print}' /etc/passwd			//显示偶数行
awk '/^root/{print}' /etc/passwd				//显示以root开头的行
awk '/nologin$/{print}' /etc/passwd		//显示以nologin结尾的行
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd      //统计以/bin/bash结尾的行数
awk 'BEGIN{RS=""};END{print NR}' /etc/ssh/sshd_config 		//统计以空行分隔的文本段落数
awk '{print NR,$0}' /etc/passwd                                 //输出每行的行号
awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd     //依次打印行号,字段数,最后字段值,制表符,每行内容
awk -F: 'NR==5{print}'  /etc/passwd                       //显示第5行
route -n|awk 'NR!=1{print}'                                 //不显示第一行
awk -F: '{print NF}' /etc/passwd                        //显示每行有多少字段
awk -F: '{print $NF}' /etc/passwd                         //将每行第NF个字段的值打印出来
 awk -F: 'NF==4 {print }' /etc/passwd                   //显示只有4个字段的行
awk -F: 'NF>2{print $0}' /etc/passwd                   //显示每行字段数量大于2的行

3. 按字段输出文本

awk -F":" '{print $3}' /etc/passwd		//显示第三列
awk -F":" '{print $1 $3}' /etc/passwd             //$1与$3相连输出,无空格,
awk -F":" '{print $1,$3}' /etc/passwd            //多了一个逗号,输出第1和第3个字段,有空格
awk -F: '$2=="!!" {print}' /etc/shadow			//统计密码为空的shadow记录
awk 'BEGIN {FS=":"}; $2=="!!" {print}' /etc/shadow	显示密码为空的用户的shadow信息
awk -F ":" '$7~"/bash" {print $1}' /etc/passwd	显示第七个字段为/bash的行的第一个字段
awk -F: 'NR==5{print}' /etc/passwd                    //显示第5行
awk -F":" '{print $1 " " $3}' /etc/passwd            //$1与$3之间手动添加空格分隔

4. 通过管道、双引号调用shell命令

awk -F: '/bash$/{print | "wc -l"}' /etc/passwd     ##统计bash用户的个数
awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'   ##统计在线用户的数量
awk 'BEGIN {"hostname" | getline;print $0}'      ##输出当前主机名

四、sort 

sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。

选项:

 -f:忽略大小写;
-b:忽略每行前面的空格;

 -M:按照月份进行排序;
-n:按照数字进行排序;
-r:反向排序;
-u:等同于
uniq,表示相同的数据仅显示一行;
-t:指定分隔符,默认使用
[Tab]键分隔;
-o <输出文件
>:将排序后的结果转存至指定文件;
-k:指定排序区域。

1. 示例

[root@localhost ~]# sort /etc/passwd   将/etc/passwd 文件中的账号进行排序。
[root@localhost ~]# sort -t ':' -rk 3 /etc/passwd   将/etc/passwd 文件中第三
列进行反向排序。

[root@localhost ~]# sort -t ':' -k 3 /etc/passwd -o user.txt  将/etc/passwd 
文件中第三列进行排序,并将输出内容保存至 user.txt 文件中。
[root@localhost ~]# cat user.txt

备注:
-r:反向排序;
-t:指定分隔符,默认使用
[Tab]键分隔;
-k:指定排序区域。

五.tr

        tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。

选项:
-c:取代所有不属于第一字符集的字符;
 -d
:删除所有属于第一字符集的字符;
-s:把连续重复的字符以单独一个字符表示;
 -t
:先删除第一字符集较第二字符集多出的字符

[root@localhost ~]# echo "KGC" | tr 'A-Z' 'a-z'  将输入字符由大写转换为小写。
[root@localhost ~]# echo "thissss is a text linnnnnnne." | tr -s 'sn'  压缩输入中重
复的字符。
[root@localhost ~]# echo 'hello world' | tr -d 'od'   删除字符串中某些字符

备注:
-s:把连续重复的字符以单独一个字符表示
-d
:删除所有属于第一字符集的字符

相关推荐

  1. Shell表达式文本处理器

    2024-06-06 04:04:04       7 阅读
  2. Shell 编程之表达式文本处理器

    2024-06-06 04:04:04       9 阅读
  3. Linux运维-SHELL编程之表达式流编辑处理器

    2024-06-06 04:04:04       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 04:04:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 04:04:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 04:04:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 04:04:04       20 阅读

热门阅读

  1. 从0开发一个Chrome插件:创建第一个Chrome插件

    2024-06-06 04:04:04       11 阅读
  2. SASS语法基础

    2024-06-06 04:04:04       9 阅读
  3. CentOS 7 64位 常用命令

    2024-06-06 04:04:04       6 阅读
  4. 03-3.1.1 栈的基本概念

    2024-06-06 04:04:04       9 阅读
  5. 日常工作笔记

    2024-06-06 04:04:04       10 阅读
  6. 带你认识ffmpeg

    2024-06-06 04:04:04       9 阅读
  7. python中使用缓存技术

    2024-06-06 04:04:04       10 阅读
  8. rpc理解

    2024-06-06 04:04:04       9 阅读