linux学习21 运维核心节能-egrep进阶及文本处理工具应用
一、egrep
1、grep:基本正则表达式,使用grep -E可支持扩展正则表达式
egrep:扩展正则表达式,使用egrep -G可以使用基本正则表达式
fgrep:不支持正则表达式
2、egrep支持扩展的正则表达式实现类似于grep文本过滤功能,grep -E
a、选项
-i,-o,-v,-q,-A,-B,-C
-G:支持基本正则表达式
3、扩展正则表达式的元字符
a、字符匹配
.:任意单个字符
[]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
b、次数匹配
*:任意次,0,1或多次
?:0次或1次,其前的字符是可有可无的
+:其前字符至少1次
{m}:其前的字符m次
{m,n}:至少m次,至多n次
{0,n}
{m,}
c、位置锚定
^:行首锚定
$:行尾锚定
\<,\b:词首锚定
\>,\b:词尾锚定
d、分组及引用
():分组,括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中
后向引用:\1,\2
e、或
a|b:a或者b
C|cat :匹配C或cat
(c|C)at:匹配cat或Cat
4、练习
(1)、找出/proc/meminfo文件中所有以大写或小写s开头的行;至少有三种实现方式
[root@node1 ~]# cat /proc/meminfo |grep -i "^[sS]" SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 8872 kB Slab: 236396 kB SReclaimable: 167468 kB SUnreclaim: 68928 kB [root@node1 ~]# cat /proc/meminfo |grep -i "^S" SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 8872 kB Slab: 236396 kB SReclaimable: 167468 kB SUnreclaim: 68928 kB [root@node1 ~]# cat /proc/meminfo |grep "^[sS]" SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 8872 kB Slab: 236396 kB SReclaimable: 167468 kB SUnreclaim: 68928 kB [root@node1 ~]# cat /proc/meminfo |grep -E "^(s|S)" SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 8872 kB Slab: 236396 kB SReclaimable: 167468 kB SUnreclaim: 68928 kB
(2)、显示当前系统上root、centos或user1用户的相关信息
[root@node1 ~]# cat /etc/passwd|grep -E "^(root|centos|user1)\>" root:x:0:0:root:/root:/bin/bash centos:x:5002:5002::/home/centos:/bin/bash user1:x:5010:5011::/home/user1:/bin/csh
(3)、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
[root@node1 ~]# cat /etc/rc.d/init.d/functions |grep -E "[[:alnum:]]+\(\)" checkpid() { __kill_pids_term_kill_checkpids() { __kill_pids_term_kill() { __pids_var_run() { __pids_pidof() { daemon() { killproc() { pidfileofproc() { pidofproc() { ...
(4)、使用echo命令输出一绝对路径,使用egrep取出其基名
[root@node1 ~]# echo "/etc/sysconfig" |grep -Eo "[^/]+$" sysconfig
进一步:取出其路径名;类似于对其执行dirname命令的结果
(5)、找出ifconfig命令结果中的1-255之间的数值
[root@node1 ~]# ifconfig |grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
(6)、课外作业:找出ifconfig命令结果中的IP地址
(7)、添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行
[root@node1 ~]# useradd bash [root@node1 ~]# useradd basher [root@node1 ~]# useradd -s /sbin/nologin nologin [root@node1 ~]# useradd testbash [root@node1 ~]# usermod -s /bin/bash bash [root@node1 ~]# usermod -s /bin/bash basher [root@node1 ~]# usermod -s /bin/bash testbash [root@node1 ~]# tail -4 /etc/passwd bash:x:5012:5013::/home/bash:/bin/bash basher:x:5013:5014::/home/basher:/bin/bash nologin:x:5015:5016::/home/nologin:/sbin/nologin testbash:x:5016:5017::/home/testbash:/bin/bash
[root@node1 ~]# grep -E "^([^:]+\>).*\1$" /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:5012:5013::/home/bash:/bin/bash nologin:x:5015:5016::/home/nologin:/sbin/nologin
二、fgrep:不支持正则表达式元字符
1、当无需用到元字符去编写模式时,使用fgrep性能更好
三、文本查看及处理工具
1、wc:word count
wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F
[root@node1 ~]# wc /etc/fstab 11 54 465 /etc/fstab #依次是11行,54个单词,465个字节,文件名称
a、选项参数
-l:lines:仅显示行数
-w:words:显示单词数
-c:bytes:显示字节数
2、cut
cut OPTION... [FILE]...
a、选项
-d CHAR:以指定的字符为分隔符
以:分割只显示/etc/passwd文件中的第一和第七个字段,可以-d:也可以 -d :
[root@node1 ~]# cut -d: -f1,7 /etc/passwd root:/bin/bash bin:/sbin/nologin daemon:/sbin/nologin adm:/sbin/nologin ...
-f FIELDS:挑选出的字段:
#:指定的单个字段
#-#:连续的多个字段
#,#:离散的多个字段
[root@node1 ~]# cut -d: -f1,3-5,7 /etc/passwd
[root@node1 ~]# wc -l /etc/rc.d/init.d/functions |cut -d " " -f1 691
3、sort
sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F
a、选项
-n:基于数值大小进行排序而非字符
[root@node1 ~]# cut -d: -f3 /etc/passwd |sort -n
-t CHAR:指定分隔符
-k #:用于排序比较的字段
[root@node1 ~]# sort -t: -k 3 -n /etc/passwd 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 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync ...
-r:逆序排序
-f:忽略字符大小写
-u:重复的行只保留一份;
重复行指连续且相同
[root@node1 ~]# cut -d: -f7 /etc/passwd|sort -u /bin/bash /bin/csh /bin/sh /bin/sync /bin/tcsh /sbin/halt /sbin/nologin /sbin/shutdown [root@node1 ~]# cut -d: -f7 /etc/passwd|sort -u|wc -l 8
4、uniq:也就是sort -u中的u。报告或移除重复的行。
uniq [OPTION]... [INPUT [OUTPUT]]
a、相应参数
-c:统计每一行重复出现的次数
[root@node1 ~]# cut -d: -f7 /etc/passwd|sort |uniq -c 11 /bin/bash 2 /bin/csh 1 /bin/sh 1 /bin/sync 1 /bin/tcsh 1 /sbin/halt 25 /sbin/nologin 1 /sbin/shutdown
-u:只显示不存在重复行的行
[root@node1 ~]# cut -d: -f7 /etc/passwd|sort |uniq -c 11 /bin/bash 2 /bin/csh 1 /bin/sh 1 /bin/sync 1 /bin/tcsh 1 /sbin/halt 25 /sbin/nologin 1 /sbin/shutdown [root@node1 ~]# cut -d: -f7 /etc/passwd|sort |uniq -u /bin/sh /bin/sync /bin/tcsh /sbin/halt /sbin/shutdown
-d:仅显示重复过的行
5、diff:用来比较两个文件的不同之处
diff [OPTION]... FILES
diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
-u:使用unfied机制,即显示要修改的上下文,默认为3行
[root@node1 ~]# diff fstab fstab.new 1c1 #第一行 < #第一个文件与第二个文件比较需要删除的为空 --- > ### #第一个文件与第二个文件比较需增加三个#号
[root@node1 ~]# diff fstab fstab.new 1,3c1 #1到三行应该增加和删除如下内容 < wohaoshuai1 < wohaoshuai2 < wohaoshuai3 --- > ### 14d11 #14行应该增加如下内容 < wohaoshuai$
6、patch:将diff的差异进行补丁
patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE
patch /PATCH/TO/OLDFILE < /PATH/TO/PATCH_FILE
[root@node1 ~]# cat fstab wohaoshuai1 wohaoshuai2 wohaoshuai3 # # /etc/fstab # Created by anaconda on Tue Jun 4 22:30:32 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=fd514a18-84be-4460-8130-706b3ec88673 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 wohaoshuai$
[root@node1 ~]# diff fstab fstab.new > fstab.patch #将差异保存至fstab.patch
[root@node1 ~]# patch -i fstab.patch fstab #将fstab.patch的差异补丁至fstab文件 patching file fstab
[root@node1 ~]# cat fstab #可以看到fstab文件内容和fstab.new文件内容一样了 ### # # /etc/fstab # Created by anaconda on Tue Jun 4 22:30:32 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=fd514a18-84be-4460-8130-706b3ec88673 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [root@node1 ~]# cat fstab.new ### # # /etc/fstab # Created by anaconda on Tue Jun 4 22:30:32 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=fd514a18-84be-4460-8130-706b3ec88673 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0
我们现在发现打了补丁后文件不对,然后我们将补丁还原回去
[root@node1 ~]# patch -R -i fstab.patch fstab patching file fstab [root@node1 ~]# cat fstab #可以看到又还原回来了 wohaoshuai1 wohaoshuai2 wohaoshuai3 # # /etc/fstab # Created by anaconda on Tue Jun 4 22:30:32 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=fd514a18-84be-4460-8130-706b3ec88673 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 wohaoshuai$
7、练习
(1)、取出ifconfig eno167777736命令结果中的ip地址