Linux三剑客

1.正则表达式

2.grep应用场合

grep egrep检索文本

grep命令不带-E选项时,支持基本正则匹配模式。比如“word”关键词检索、“^word”匹配以word开头的行、“word$”匹配以word结尾的行......等等。

输出以“r”开头的用户记录:

[root@svr5 ~]# grep '^r' /etc/passwd
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

输出以local host结尾的行

[root@svr5 ~]# grep 'localhost$' /etc/hosts
127.0.0.1               localhost.localdomain localhost

若希望在grep检索式同时组合多个条件,比如输出以“root”或者以“daemon”开头的行:

[root@svr5 ~]# grep '^root|^daemon' /etc/passwd          //搜索无结果

而若使用grep -E或egrep命令,可支持扩展正则匹配模式,能够自动识别 |、{} 等扩展正则表达式中的特殊字符,用起来更加方便,比如:

[root@svr5 ~]# grep -E '^(root|daemon)' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@svr5 ~]# egrep '^(root|daemon)' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin

1)grep、egrep命令的-q选项

选项 -q 表示 quiet(静默)的意思,结合此选项可以只做检索而并不输出,通常在脚本内用来识别查找的目标是否存在,通过返回状态 $?来判断,这样可以忽略无关的文本信息,简化脚本输出。

比如,检查/etc/hosts文件内是否存在192.168.4.4的映射记录,如果存在则显示“YES”,否则输出“NO”,一般会执行:

[root@svr5 ~]# grep '^192.168.4.4' /etc/hosts && echo "YES" || echo "NO"
192.168.4.4     svr5.tarena.com svr5
YES

2)基本元字符 ^、$ —— 匹配行首、行尾

[root@svr5 ~]# egrep -m10 '/sbin/nologin$' /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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@svr5 ~]# egrep -c '/sbin/nologin$' /etc/passwd
32      

使用 -c 选项可输出匹配行数,这与通过管道再 wc -l的效果是相同的,但是写法更简便。比如,统计使用“/bin/bash”作为登录Shell的正常用户个数,可执行。

[root@svr5 ~]# egrep -c '/bin/bash$' /etc/passwd
26
[root@svr5 ~]# egrep '/bin/bash$' /etc/passwd | wc -l
26

3)基本元字符 +、?、* —— 目标出现的次数

以/etc/rc.local文件为例:

[root@svr5 ~]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local

输出包括 f、ff、ff、......的行,即“f”至少出现一次:

[root@svr5 ~]# egrep 'f+' /etc/rc.local
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

输出包括init、initial的行,即末尾的“ial”最多出现一次(可能没有):

[root@svr5 ~]# egrep 'init(ial)?' /etc/rc.local
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

输出包括stu、stuf、stuff、stufff、......的行,即末尾的"f"可出现任意多次,也可以没有。重复目标只有一个字符时,可以不使用括号:

[root@svr5 ~]# egrep 'stuf*' /etc/rc.local
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

输出所有行,单独的".*"可匹配任意行(包括空行):

[root@svr5 ~]# egrep '.*' /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local

输出/etc/passwd文件内“r”开头且以“nologin”结尾的用户记录,即中间可以是任意字符:

[root@svr5 ~]# egrep '^r.*nologin$' /etc/passwd
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

4)元字符 {} —— 限定出现的次数范围

创建一个用于练习测试的文件

[root@svr5 ~]# vim brace.txt
ab def ghi abdr
dedef abab ghighi
abcab CD-ROM
TARENA IT GROUP
cdcd ababab
Hello abababab World

输出包括ababab的行,即“ab”连续出现3次:

[root@svr5 ~]# egrep '(ab){3}' brace.txt
cdcd ababab
Hello abababab World

输出包括abab、ababab、abababab的行,即“ab”连续出现2~4次:

[root@svr5 ~]# egrep '(ab){2,4}' brace.txt
dedef abab ghighi
cdcd ababab
Hello abababab World

输出包括ababab、abababab、......的行,即“ab”最少连续出现3次:

[root@svr5 ~]# egrep '(ab){3,}' brace.txt
cdcd ababab
Hello abababab World

5)元字符 [] —— 匹配范围内的单个字符

[root@svr5 ~]# cat brace.txt
ab def ghi abdr
dedef abab ghighi
abcab CD-ROM
TARENA IT GROUP
cdcd ababab
Hello abababab World

输出包括abc、abd的行,即前两个字符为“ab”,第三个字符只要是c、d中的一个就符合条件:

[root@svr5 ~]# egrep 'ab[cd]' brace.txt
ab def ghi abdr
abcab CD-ROM

输出包括大写字母的行,使用[A-Z]匹配连续范围:

[root@svr5 ~]# egrep '[A-Z]' brace.txt
abcab CD-ROM
TARENA IT GROUP
Hello abababab World

过滤"非小写字母"的其他字符:

[root@svr5 ~]# egrep '[^a-z]' brace.txt

6)单词边界匹配

[root@svr5 ~]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local

输出包括单词“init”的行,文件中“initialization”不合要求:

[root@svr5 ~]# egrep '\binit\b' /etc/rc.local
# This script will be executed *after* all the other init scripts.
# want to do the full Sys V style init stuff.

输出包括以"ll"结尾的单词的行,使用 \> 匹配单词右边界:

[root@svr5 ~]# egrep 'll\>' /etc/rc.local
# This script will be executed *after* all the other init scripts.
# want to do the full Sys V style init stuff.

7)多个条件的组合

通过dmesg启动日志查看蓝牙设备、网卡设备相关的信息:

[root@svr5 ~]# egrep -i 'eth|network|bluetooth' /var/log/dmesg
Initalizing network drop monitor service
Bluetooth: Core ver 2.10
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: HCI USB driver ver 2.9
Intel(R) PRO/1000 Network Driver - version 7.3.21-k4-3-NAPI
e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection

3.sed基本用法

熟悉sed命令的p、d、s等常见操作,并结合正则表达式,完成以下任务:

  • 删除文件中每行的第二个、最后一个字符
  • 将文件中每行的第一个、第二个字符互换
  • 删除文件中所有的数字
  • 为文件中每个大写字母添加括号

sed文本处理工具的用法:

  1. 用法1:前置命令 | sed [选项] '条件指令'
  2. 用法2:sed [选项] '条件指令' 文件.. ..

相关说明如下:

  • 条件可以是行号或者/正则/
  • 没有条件时,默认为所有条件
  • 指令可以是增、删、改、查等指令
  • 默认sed会将所有输出的内容都打印出来,可以使用-n屏蔽默认输出
  • 选项中可以使用-r选项,让sed支持扩展正则

步骤一:认识sed工具的基本选项

sed命令的常用选项如下:

-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)

-r(让sed支持扩展正则)

-i(sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响)

1)sed命令的 -n 选项

执行p打印等过滤操作时,希望看到的是符合条件的文本。但不使用任何选项时,默认会将原始文本一并输出,从而干扰过滤效果。比如,尝试用sed输出/etc/hosts的第1行

[root@svr5 ~]# sed '1p' /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

行号可以是连续的行号,如打印passwd第3到第6行账户的信息:

[root@svr5 ~]# sed  -n '3,6p' /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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

2)sed命令的 -i 选项

正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件做任何更改:

[root@svr5 ~]# sed 'd' /etc/passwd                      //删除所有行
[root@svr5 ~]# cat /etc/passwd                          //查看原始文本,并未改动

比如,直接删除test.txt(自行创建一个任意内容的文件)的第1~4行:

[root@svr5 ~]# sed -i '1,4d' test.txt            //删除操作
[root@svr5 ~]# cat test.txt                      //确认删除结果

3)多个指令可以使用分号隔离

用分号来隔离多个操作,比如:

[root@svr5 ~]# sed -n '1p;4p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin

sed命令可以使用行号或正则做为条件匹配:

1)行号案例

打印第3行:

[root@svr5 ~]# sed -n '3p' /etc/passwd

打印第3到5行:

[root@svr5 ~]# sed -n '3,5p' /etc/passwd

打印第3和5行:

[root@svr5 ~]# sed -n '3p;5p' /etc/passwd

打印第3以及后面的10行:

[root@svr5 ~]# sed -n '3,+10p' /etc/passwd

打印奇数行:

[root@svr5 ~]# sed -n '1~2p' /etc/passwd

打印偶数行:

[root@svr5 ~]# sed -n '2~2p' /etc/passwd

2)正则案例

打印包含root的行:

[root@svr5 ~]# sed -n '/root/p' /etc/passwd

打印bash结尾的行:

[root@svr5 ~]# sed -n '/bash$/p' /etc/passwd

3)没有条件,则表示匹配所有行

[root@svr5 ~]# sed -n 'p' /etc/passwd

步骤三:sed工具的p、d、s操作指令案例集合

1)下面看看sed工具的p指令案例集锦(自己提前生成一个a.txt文件)

[root@svr5 ~]# sed  -n 'p' a.txt            //输出所有行,等同于cat a.txt
[root@svr5 ~]# sed  -n '4p' a.txt            //输出第4行
[root@svr5 ~]# sed  -n '4,7p' a.txt        //输出第4~7行
[root@svr5 ~]# sed  -n '4,+10p' a.txt        //输出第4行及其后的10行内容
[root@svr5 ~]# sed  -n '/^bin/p' a.txt        //输出以bin开头的行
[root@svr5 ~]# sed  -n '$=' a.txt            //输出文件的行数

2)下面看看sed工具的d指令案例集锦(自己提前生成一个a.txt文件)

[root@svr5 ~]# sed  '3,5d' a.txt             //删除第3~5行
[root@svr5 ~]# sed  '/xml/d' a.txt            //删除所有包含xml的行
[root@svr5 ~]# sed  '/xml/!d' a.txt         //删除不包含xml的行,!符号表示取反
[root@svr5 ~]# sed  '/^install/d' a.txt    //删除以install开头的行
[root@svr5 ~]# sed  '$d' a.txt                //删除文件的最后一行
[root@svr5 ~]# sed  '/^$/d' a.txt             //删除所有空行

3)sed命令的s替换基本功能(s/旧内容/新内容/选项)

[root@svr5 ~]# vim  test.txt                //新建素材
2017 2011 2018
2017 2017 2024
2017 2017 2017
[root@svr5 ~]# sed 's/2017/xxxx/'           test.txt
[root@svr5 ~]# sed 's/2017/xxxx/g'          test.txt
[root@svr5 ~]# sed 's/2017/xxxx/2'          test.txt
[root@svr5 ~]# sed 's/2017//2'              test.txt
[root@svr5 ~]# sed -n 's/2017/xxxx/p'      test.txt

4)下面看看sed工具的s指令案例

注意:替换操作的分隔“/”可改用其他字符,如#、&等,便于修改文件路径

[root@svr5 ~]# sed 's/xml/XML/'  a.txt        //将每行中第一个xml替换为XML
[root@svr5 ~]# sed 's/xml/XML/3' a.txt     //将每行中的第3个xml替换为XML
[root@svr5 ~]# sed 's/xml/XML/g' a.txt     //将所有的xml都替换为XML
[root@svr5 ~]# sed 's/xml//g'     a.txt     //将所有的xml都删除(替换为空串)
[root@svr5 ~]# sed 's#/bin/bash#/sbin/sh#' a.txt  //将/bin/bash替换为/sbin/sh
[root@svr5 ~]# sed '4,7s/^/#/'   a.txt         //将第4~7行注释掉(行首加#号)
[root@svr5 ~]# sed 's/^#an/an/'  a.txt         //解除以#an开头的行的注释(去除行首的#号)

4.awk基本用法

1)基本操作方法

格式:awk [选项] '[条件]{指令}' 文件

其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。

Awk过滤数据时支持仅打印某一列,如第2列、第5列等。

处理文本时,若未指定分隔符,则默认将空格、制表符等作为分隔符。

直接过滤文件内容:

[root@svr5 ~]# cat test.txt 
hello the world
welcome to beijing
[root@svr5 ~]# awk '{print $1,$3}' test.txt        //打印文档第1列和第3列
hello world
welcome beijing

结合管道过滤命令输出:

[root@svr5 ~]# df -h | awk '{print $4}'        //打印磁盘的剩余空间

2)选项 -F 可指定分隔符

输出passwd文件中以分号分隔的第1、7个字段,显示的不同字段之间以逗号隔开,操作如下:

[root@svr5 ~]# awk -F: '{print $1,$7}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
… …

awk还识别多种单个的字符,比如以“:”或“/”分隔,输出第1、10个字段:

[root@svr5 ~]# awk -F [:/] '{print $1,$10}' /etc/passwd
root bash
bin nologin
daemon nologin
adm sbin
… …

awk常用内置变量:

$0 文本当前行的全部内容

$1 文本的第1列

$2 文件的第2列

$3 文件的第3列,依此类推

NR 文件当前行的行号

NF 文件当前行的列数(有几列)

输出每次处理行的行号,以及当前行以“:”分隔的字段个数(有几列):

[root@svr5 ~]# awk -F: '{print NR,NF}' passwd.txt
1 7
2 7
3 7
.. ..

2)awk的print指令不仅可以打印变量,还可以打印常量

[root@svr5 ~]# awk -F: '{print $1,"的解释器:",$7}' /etc/passwd
root 的解释器: /bin/bash
bin 的解释器: /sbin/nologin
… …

1)提取IP地址

分步实现的思路及操作参考如下——

通过ifconfig eth0查看网卡信息,其中包括网卡流量:

[root@svr5 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.4.21  netmask 255.255.255.0  broadcast 192.168.4.255
        inet6 fe80::fa64:c143:ad6a:5159  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:b3:11:11  txqueuelen 1000  (Ethernet)
        RX packets 313982  bytes 319665556 (304.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 51809  bytes 40788621 (38.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

RX为接收的数据量,TX为发送的数据量。packets以数据包的数量为单位,bytes以字节为单位:

[root@svr5 ~]# ifconfig eth0 | awk '/RX p/{print $5}'    //过滤接收数据的流量
319663094
[root@svr5 ~]# ifconfig eth0 | awk '/TX p/{print $5}'     //过滤发送数据的流量
40791683

2)提取根分区剩余容量

分步实现的思路及操作参考如下——

通过df命令查看根分区的使用情况,其中包括剩余容量:

[root@svr5 ~]# df -h /
文件系统             容量     已用     可用     已用%     挂载点
/dev/sda2         19G         7.2G     11G         40%         /
输出上述结果中最后一行的第4列:
[root@svr5 ~]# df -h / | tail -1 | awk '{print $4}'
11G

或者直接在awk中使用正则:

[root@svr5 ~]# df -h | awk '/\/$/{print $4}'
11G

3)根据/var/log/secure日志文件,过滤远程连接密码失败的IP地址

[root@svr5 ~]# awk '/Failed/{print $11}' /var/log/secure
192.168.2.254
192.168.2.100
... ...
  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Linux三剑客是指在Linux系统中经常使用的三个命令行工具,分别是grep、awk和sed。 首先是grep命令,它是Global Regular Expression Print的缩写,用于在文件中查找匹配某一模式的行。grep命令的基本语法是"grep [选项] 模式 文件",可以使用各种选项来处理不同的需求。grep命令的应用非常广泛,常用于检索文件内容、过滤日志、查找错误等,通过使用正则表达式,可以实现更高级的搜索。 其次是awk命令,它是一种文本处理语言,经常用于对文本文件进行分析和处理。awk命令的语法是"awk '条件 动作' 文件",其中条件是用于选择匹配的行,动作是对匹配的行执行的操作。awk命令可以方便地进行字段提取、计算、格式化输出等操作,特别适合处理结构化的文本数据。 最后是sed命令,它是Stream Editor的缩写,是一种基于行的文本处理工具。sed命令的基本语法是"sed [选项] '动作' 文件",其中动作是对每一行执行的操作。sed命令可以进行文本的增删改查等操作,如替换、删除、插入等,可以通过正则表达式实现复杂的模式匹配和替换。 Linux三剑客Linux系统中非常重要的命令行工具,它们的灵活性和强大功能使得我们可以方便地对文本文件进行操作和处理。无论是开发、运维还是日常使用,熟练掌握grep、awk和sed命令都对提高工作效率和解决问题非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大 大金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值