Shell脚本三剑客——Grep(进阶版egrep)、Sed、Awk命令

Grep命令

1、基本正则表达式实例——查找特定字符

这里我们就以存放本机所有用户的/etc/passwd文件做实例

Demo1

[[email protected] ~]# grep -n "root" /etc/passwd      //-n表示显示行号
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

2、基本正则表达式实例——查找集合字符

有重复的字符时,可使用“[ ]”来进行集合匹配,每次只匹配“[ ]”中的一个字符。

Demo2

[[email protected] ~]# grep -n "[fn]tp" /etc/passwd
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
27:ntp:x:38:38::/etc/ntp:/sbin/nologin

3、基本正则表达式实例——反向选择

在“[ ]”中括号中添加“^”表示进行反向选择(有一定的基础的朋友肯定知道“^[ ]”表示定位行首,这里“^”内外位置意思将完全不同。)

Demo3

[[email protected] ~]# grep -n "^[^root]" /etc/passwd       //匹配除了以root开头的所有选项
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
42:named:x:25:25:Named:/var/named:/sbin/nologin

4、基本正则表达式实例——转义符

在正则表达式中一个元字符,所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符。

Demo4

[[email protected] ~]# grep -n ‘\.$‘ test.txt 1:he was short and fat.
2:He was wearing a blue polo shirt with black pants. 3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.

5、基本正则表达式实例——查找任一字符&查找重复字符

在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。

Demo5-1

[[email protected] ~]# grep -n "r..t" /etc/passwd        //(.)小数点这里代表任一字符
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

在上述结果中,“root”字符串“r..t”匹配规则。若想要查询 oo、ooo、ooooo 等资料,则需要使用星号(*)元字符。但需要注意的是,“*”代表的是重复零个或多个前面的单字符。“o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符

Demo5-2

[[email protected] ~]# grep -n "oo*" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......

6、基本正则表达式实例——查找连续字符范围

例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{ }”。因为“{ }”在 Shell 中具有特殊 意义,所以在使用“{ }”字符时,需要利用转义字符“\”,将“{ }”字符转换成普通字符。

Demo6

[[email protected] ~]# grep -n "0\{2,\}" /etc/passwd       //表示中间包含2以上o的字符串
11:games:x:12:100:games:/usr/games:/sbin/nologin
41:zhy:x:1000:1000:zhy:/home/zhy:/bin/bash

Egrep命令

此外,grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。awk 命令在后面的进行讲解,这里我们直接使用 egrep 命令。egrep 命令与 grep 命令的用法基本相似。(grep命令能用的egrep命令同样能够使用)

扩展正则表达式元字符 作用
+ 作用:重复一个或者一个以上的前一个字符
作用:零个或者一个的前一个字符
| 作用:使用或者(or)的方式找出多个字符
() 作用:查找“组”字符串
()+ 作用:辨别多个重复的组

Demo演示

[[email protected] ~]# egrep -n "10+" /etc/passwd             //使用“+”扩展元字符
11:games:x:12:100:games:/usr/games:/sbin/nologin
31:qemu:x:107:107:qemu user:/:/sbin/nologin
41:zhy:x:1000:1000:zhy:/home/zhy:/bin/bash

[[email protected] ~]# egrep -n "10?" /etc/passwd             //使用“?”扩展元字符
2:bin:x:1:1:bin:/bin:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin

[[email protected] ~]# egrep -n ‘root|zhy‘ /etc/passwd        //使用“|”扩展元字符
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
41:zhy:x:1000:1000:zhy:/home/zhy:/bin/bash

[[email protected] ~]# egrep -n ‘(f|n)tp‘ /etc/passwd        //使用“()”扩展元字符,可与“|”一起使用
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
27:ntp:x:38:38::/etc/ntp:/sbin/nologin

Sed命令

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作

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

? 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓

冲区中(又称模式空间,pattern space)。

? 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。

? 显示:发送修改后的内容到输出流。再发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意: 默认情况下,所有的sed命令都是在模式空间中进行,并不会进行保存。

Sed命令格式

sed [选项] ‘操作‘ 参数

sed [选项] -f scriptfile 参数 // scriptfile 表示脚本文件

常用选项

-e :表示用指定命令或者脚本来处理输入的文本文件。

-f :表示用指定的脚本文件来处理输入的文本文件。

-h :显示帮助。

-n:表示仅显示处理后的结果。

-i:直接编辑文本文件。

常用的“操作”参数

a:增加,在当前行下面增加一行指定内容。

c:替换,将选定行替换为指定内容。

d:删除,删除选定的行

i:插入,在选定行上面插入一行指定内容。

p:打印,其通常与“-n”选项一起使用

s:替换,替换指定字符。

y:字符转换。

基本用法实例:

输出所有,效果等同cat命令

[[email protected] ~]# sed -n ‘p‘ /etc/passwd                //效果等同cat命令
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......

输出某一特定行,或者某一段行

[[email protected] ~]# sed -n ‘10p‘ /etc/passwd                   //输出第10行内容
operator:x:11:0:operator:/root:/sbin/nologin

[[email protected] ~]# sed -n ‘2,4p‘ /etc/passwd                 //输出2~4行内容
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

输出所有奇数行

[[email protected] ~]# sed -n ‘n;p‘ /etc/passwd                //输出奇数行,偶数行为p;n
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
......

同样,除了基本的使用方法,sed命令也可以结合正则表达式进行使用

输出包含特定内容的行(和grep命令一样,可以使用^、$来定位行首、行尾)

[[email protected] ~]# sed -n ‘/root/p‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

输出包含特定单词的行

[[email protected] ~]# sed -n ‘/\<root\>/p‘ /etc/passwd           //\<  \>代表单词边界
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

替换符合条件的文本

sed ‘s/the/THE/‘ test.txt //将每行中的第一个the 替换为 THE

sed ‘s/l/L/3‘ test.txt //将每行中的第 3 个l 替换为L

sed ‘s/the/THE/g‘ test.txt //将文件中的所有the 替换为THE

sed ‘s/o//g‘ test.txt //将文件中的所有o 删除(替换为空串)

sed ‘s/^/#/‘ test.txt //在每行行首插入#:号

sed ‘/the/s/^/#/‘ test.txt //在包含the 的每行行首插入#号

sed ‘s/$/EOF/‘ test.txt //在每行行尾插入字符串EOF

sed ‘3,5s/the/THE/g‘ test.txt //将第 3~5 行中的所有the 替换为 THE

sed ‘/the/s/o/O/g‘ test.txt //将包含the 的所有行中的o 都替换为 O

将文本进行迁移

sed ‘/the/{H;d};$G‘ test.txt //将包含the 的行迁移至文件末尾,{;}用于多个操作

sed ‘1,5{H;d};17G‘ test.txt //将第 1~5 行内容转移至第 17 行后

sed ‘/the/w out.file‘ test.txt //将包含the 的行另存为文件out.file

sed ‘/the/r /etc/hostname‘ test.txt //将文件/etc/hostname 的内容添加到包含the 的每行以后

sed ‘3aNew‘ test.txt //在第 3 行后插入一个新行,内容为 New

sed ‘/the/aNew‘ test.txt //在包含the 的每行后插入一个新行,内容为 New

sed ‘3aNew1\nNew2‘ test.txt //在第 3 行后插入多行内容,中间的\n 表示换行

AWK命令

AWK 是一种用于处理文本的编程语言工具。AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法,是任何环境中现有的功能最强大的数据处理引擎之一。

基本结构

awk [选项] ‘模式或条件 {编辑命令}‘ 文件1 文件2 //过滤并输出匹配内容

awk -f 脚本文件 文件1 文件2 //从脚本中调用,并输出

基本使用实例

[[email protected] ~]# awk -F: ‘{print $1,$3}‘ /etc/passwd
//以“:”作为分隔符,筛选出第一列和第三列的内容,并输出(默认情况下字段的分隔符为空格或者 tab 键)
root 0
bin 1
daemon 2
adm 3
......

特殊的内建变量(可直接引入使用)

FS:指定每行文本的字段分隔符,默认为空格或制表位。

NF:当前处理的行的字段个数。

NR:当前处理的行的行号(序数)。

$0:当前处理的行的整行内容。

$n:当前处理行的第 n 个字段(第 n 列)。

FILENAME:被处理的文件名。

RS:数据记录分隔,默认为\n,即每行为一条记录。

按行对文本进行输出

[[email protected] ~]# awk ‘NR==2,NR==4{print}‘ /etc/passwd
//输出第二行到第四行文本内容
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[[email protected] ~]# awk -F ":" ‘NR==2,NR==4{print $1,$3}‘ /etc/passwd
//输出第二行到第四行的第一列和第三列内容
bin 1
daemon 2
adm 3

[[email protected] ~]# awk ‘(NR==1)||(NR==4){print}‘ /etc/passwd
//输出第一行和第四行内容
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin

输出奇、偶行(在awk中可以使用逻辑操作符“&&”,表示“与”, “||”表示“或”,“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别 表示加、减、乘、除、取余和乘方)

[[email protected] ~]# awk ‘NR%2==1{print}‘ /etc/passwd        //输出奇数行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
......

[[email protected] ~]# awk ‘NR%2==0{print}‘ /etc/passwd       //输出偶数行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
......

输出以root开头的行

[[email protected] ~]# awk ‘/^root/{print}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash

统计以/bin/bash结尾的行数

[[email protected] ~]# awk ‘BEGIN {x=0} ; /\/bin\/bash$/{x++};END {print x}‘ /etc/passwd
2

统计以空行分隔的文本段落数:

[[email protected] opt]# vim name.txt
zhangsan:lisi:wangwu
zhaoliu:liuliu
heiba:heihei
[[email protected] opt]# awk ‘BEGIN{RS=":"};END{print NR}‘ /opt/name.txt
5
//统计规则:遇到关键符号,折行

调用w 命令,并用来统计在线用户数:

[[email protected] opt]# awk ‘BEGIN {while ("w" | getline) n++;{print n-2}}‘
1

原文地址:https://blog.51cto.com/14484404/2440842

时间: 2024-08-13 13:53:55

Shell脚本三剑客——Grep(进阶版egrep)、Sed、Awk命令的相关文章

find/pg/grep/sed/awk命令

find pathname -options [-print -exec -ok ...] -print: find命令将匹配的文件输出到标准输出. 当前目录下查找文件权限位为 7 5 5的文件 $ find . -perm 755 -print 当前目录及子目录中查找文件名以一个大写字母开头的文件 $ find . -name "[A-Z]*" 希望在系统根目录下查找更改时间在 5日以内的文件 $ find / -mtime -5 -print 为了在/var/adm目录下查找更改时

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

学习Shell脚本编程(第1期)_Shell命令行书写规则

Shell命令行的书写规则 对Shell命令行基本功能的理解有助于编写更好的Shell程序,在执行Shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(:)分隔命令,例如: [[email protected] root]# ls a* -l;free;df 长Shell命令行可以使用反斜线字符(\)在命令行上扩充,例如: [[email protected] root]# echo "this is \ >long command" This is long com

shell脚本之grep的使用方法

笔者最近在使用shell脚本中处理字符串,因此使用了大量shell脚本中的四剑客(awk,grep,sed,cut)而其中使用最多的两种方法就是grep和awk,因此想总结整理一下. 一.grep的意义 二.grep的基本用法 三.awk的意义 四.awk的基本用法 五.实例说明两者怎么用 一.grep的意义 首先,grep是用来处理行数据的基本命令集,简单来说它的使用意义就在于当你想要找到某个文件中的某个字符串以及它相关联的信息时(比如说行数),那么你就需要这个命令了. 二.grep的基本用法

shell脚本中grep时关于变量带双引号的小问题

今天在写一个shell脚本的时候,有一个操作是使用grep命令在一个文件中搜索指定内容.指定内容存放在文件中,使用一个变量去获取文件中内容,再传到grep命令中去. 这段代码如下: for target in `cat content.txt`do     grep $target test.txt >>result.txtdone content.txt文本中的内容为: "域\[2\]" "域\[3\]" "域\[4\]" 因为使用

shell脚本学习笔记 (流编辑器sed)

sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出. sed不只支持正則表達式.它另一些比較厉害的功能. 我给出一个样例,大家看看有什么办法能够解决它吧. <html><head><title>Hello World</title> <body>Welcome to the world of regexp!&l

Shell学习:grep, sed, awk命令的练习题

文件:datafileSteve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500Igor Chevsky:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400Norma Corder

Shell脚本三剑客(awk、sort、uniq)内含多个小Demo

awk工具 在Linux/UNIX系统中,awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以再无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务. 1.awk常见用法:通常情况下 awk 所使用的命令格式如下所示,其中,单引号加上大括号"{}"用于设置对数据进行的处理动作.awk 可以直接处理目标文件,也可以通过"-f"读取脚本对目标文件进行处理. D

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种: