文本处理工具及正规表达式

文本处理工具及正规表达式

2 文本常见处理工具

2.1 文件内容查看命令

2.1.1 查看文本文件内容

2.1.1.1 cat

cat 可以查看文本内容

格式:

cat [OPTION]... [FILE]...

常见选项

-E:显示行结束符$

-A:显示所有控制符

-n:对显示出的每一行进行编号

-b:非空行编号

-s:压缩连续的空行成一行

范例:

[root@kd-csy-kvm-host ~]# cat -A /etc/fstab 
$
#$
# /etc/fstab$
# Created by anaconda on Thu Apr 29 02:47:48 2021$
#$
# 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.$
#$
# After editing this file, run 'systemctl daemon-reload' to update systemd$
# units generated from this file.$
#$
/dev/mapper/cl_kd--csy--kvm--host-root /                       xfs     defaults        0 0$
UUID=ebdd101d-a583-4f25-8208-9f33140b6800 /boot                   xfs     defaults        0 0$
/dev/mapper/cl_kd--csy--kvm--host-swap none                    swap    defaults        0 0$	


[root@kd-csy-kvm-host ~]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Thu Apr 29 02:47:48 2021
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl_kd--csy--kvm--host-root /                       xfs     defaults        0 0
UUID=ebdd101d-a583-4f25-8208-9f33140b6800 /boot                   xfs     defaults        0 0
/dev/mapper/cl_kd--csy--kvm--host-swap none                    swap    defaults        0 0

2.1.1.2 nl

显示行号,相当于cat -b

[root@kd-csy-kvm-host ~]# nl /etc/fstab 
       
     1	#
     2	# /etc/fstab
     3	# Created by anaconda on Thu Apr 29 02:47:48 2021
     4	#
     5	# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
     6	# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
     7	#
     8	# After editing this file, run 'systemctl daemon-reload' to update systemd
     9	# units generated from this file.
    10	#
    11	/dev/mapper/cl_kd--csy--kvm--host-root /                       xfs     defaults        0 0
    12	UUID=ebdd101d-a583-4f25-8208-9f33140b6800 /boot                   xfs     defaults        0 0
    13	/dev/mapper/cl_kd--csy--kvm--host-swap none                    swap    defaults        0 0

2.1.1.3 tac

逆向显示文本内容

[root@kd-csy-kvm-host ~]# tac /etc/fstab 
/dev/mapper/cl_kd--csy--kvm--host-swap none                    swap    defaults        0 0
UUID=ebdd101d-a583-4f25-8208-9f33140b6800 /boot                   xfs     defaults        0 0
/dev/mapper/cl_kd--csy--kvm--host-root /                       xfs     defaults        0 0
#
# units generated from this file.
# After editing this file, run 'systemctl daemon-reload' to update systemd
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
#
# Created by anaconda on Thu Apr 29 02:47:48 2021
# /etc/fstab
#

2.1.1.4 rev

将同一行的内容逆向显示

[root@kd-csy-kvm-host ~]# rev /etc/fstab 

#
batsf/cte/ #
1202 84:74:20 92 rpA uhT no adnocana yb detaerC #
#
.'/ksid/ved/' rednu deniatniam era ,ecnerefer yb ,smetsyselif elbisseccA #
.ofni erom rof )8(diklb ro/dna )8(tnuom ,)8(sfdnif ,)5(batsf segap nam eeS #
#
dmetsys etadpu ot 'daoler-nomead ltcmetsys' nur ,elif siht gnitide retfA #
.elif siht morf detareneg stinu #
#
0 0        stluafed     sfx                       / toor-tsoh--mvk--ysc--dk_lc/reppam/ved/
0 0        stluafed     sfx                   toob/ 0086b04133f9-8028-52f4-385a-d101ddbe=DIUU
0 0        stluafed    paws                    enon paws-tsoh--mvk--ysc--dk_lc/reppam/ved/

2.2 分页查看文件内容

2.2.1 more

可以实现分页查看文件,可以配合管道实现输出信息的分页

格式:

more [OPTIONS...] FILE...

选项:

-d: 显示翻页及退出提示

less 也可以实现分页查看文件或STDIN输出

查看时有用的命令包括:

/文本 搜索 文本

n/N 跳到下一个 或 上一个匹配

2.2.2 less

less 命令是man命令使用的分页器

cat /etc/init.d/functions |more
# -*-Shell-script-*-
#
# functions This file contains functions to be used by most or all
#       shell scripts in the /etc/init.d directory.
#

TEXTDOMAIN=initscripts

# Make sure umask is sane
umask 022

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH
......省略

cat /etc/init.d/functions |less
# -*-Shell-script-*-
#
# functions This file contains functions to be used by most or all
#       shell scripts in the /etc/init.d directory.
#

TEXTDOMAIN=initscripts

# Make sure umask is sane
umask 022

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH

if [ $PPID -ne 1 -a -z "$SYSTEMCTL_SKIP_REDIRECT" ] && \
        [ -d /run/systemd/system ] ; then
    case "$0" in
    /etc/init.d/*|/etc/rc.d/init.d/*)
        _use_systemctl=1
        ;;
    esac
fi

systemctl_redirect () {
    local s
    local prog=${1##*/}
    local command=$2
    local options=""

    case "$command" in
......省略

2.3 显示文本前或后行内容

2.3.1 head

可以显示文件或标准输入的前面行

格式:

head [OPTION]... [FILE]...

选项:

-c # 指定获取前#字节

-n # 指定获取前#行

-# 同上

[root@kd-csy-kvm-host /]# head -3 /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

[root@kd-csy-kvm-host /]# cat /dev/urandom | tr -dc '[:alnum:]'| head -c10
[root@kd-csy-kvm-host /]#cat /dev/urandom | tr -dc '[:alnum:]'| head -c10 |tee pass.txt | passwd --stdin mage

2.3.2 tail

tail 和head 相反,查看文件或标准输入的倒数行

格式:

tail [OPTION]... [FILE]...

-c # 指定获取后#字节

-n # 指定获取后#行

-# 同上

-f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名

文件,将无法继续跟踪文件

-F 跟踪文件名,相当于–follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件

tailf 类似 tail –f,当文件不增长时并不访问文件

[root@kd-csy-kvm-host /]# tail /var/log/messages
May  8 13:10:52 kd-csy-kvm-host dnf[4314]: Repository centosplus is listed more than once in the configuration
May  8 13:10:52 kd-csy-kvm-host dnf[4314]: Metadata cache refreshed recently.
May  8 13:10:52 kd-csy-kvm-host systemd[1]: dnf-makecache.service: Succeeded.
May  8 13:10:52 kd-csy-kvm-host systemd[1]: Started dnf makecache.
May  8 14:11:52 kd-csy-kvm-host systemd[1]: Starting dnf makecache...
May  8 14:11:52 kd-csy-kvm-host dnf[4842]: Repository extras is listed more than once in the configuration
May  8 14:11:52 kd-csy-kvm-host dnf[4842]: Repository centosplus is listed more than once in the configuration
May  8 14:11:52 kd-csy-kvm-host dnf[4842]: Metadata cache refreshed recently.
May  8 14:11:52 kd-csy-kvm-host systemd[1]: dnf-makecache.service: Succeeded.
May  8 14:11:52 kd-csy-kvm-host systemd[1]: Started dnf makecache.
[root@kd-csy-kvm-host /]# tail -f /var/log/messages
May  8 13:10:52 kd-csy-kvm-host dnf[4314]: Repository centosplus is listed more than once in the configuration
May  8 13:10:52 kd-csy-kvm-host dnf[4314]: Metadata cache refreshed recently.
May  8 13:10:52 kd-csy-kvm-host systemd[1]: dnf-makecache.service: Succeeded.
May  8 13:10:52 kd-csy-kvm-host systemd[1]: Started dnf makecache.
May  8 14:11:52 kd-csy-kvm-host systemd[1]: Starting dnf makecache...
May  8 14:11:52 kd-csy-kvm-host dnf[4842]: Repository extras is listed more than once in the configuration
May  8 14:11:52 kd-csy-kvm-host dnf[4842]: Repository centosplus is listed more than once in the configuration
May  8 14:11:52 kd-csy-kvm-host dnf[4842]: Metadata cache refreshed recently.
May  8 14:11:52 kd-csy-kvm-host systemd[1]: dnf-makecache.service: Succeeded.
May  8 14:11:52 kd-csy-kvm-host systemd[1]: Started dnf makecache.
^C
[root@kd-csy-kvm-host /]# tail -5 /var/log/messages
May  8 14:11:52 kd-csy-kvm-host dnf[4842]: Repository extras is listed more than once in the configuration
May  8 14:11:52 kd-csy-kvm-host dnf[4842]: Repository centosplus is listed more than once in the configuration
May  8 14:11:52 kd-csy-kvm-host dnf[4842]: Metadata cache refreshed recently.
May  8 14:11:52 kd-csy-kvm-host systemd[1]: dnf-makecache.service: Succeeded.
May  8 14:11:52 kd-csy-kvm-host systemd[1]: Started dnf makecache.

2.3.3 tr
	tr命令用于压缩空格,常用选项是-s

2.4 按列抽取文本cut

cut 命令可以提取文本文件或STDIN数据的指定列

格式:

cut [OPTION]... [FILE]...

选项

-d DELIMITER: 指明分隔符,默认tab

-f FILEDS:

#: 第#个字段,例如:3

#,#[,#]:离散的多个字段,例如:1,3,6

#-#:连续的多个字段, 例如:1-6

混合使用:1-3,7

-c 按字符切割

–output-delimiter=STRING指定输出分隔符

[root@kd-csy-kvm-host /]# cut -d: -f1,3-4,7 /etc/passwd |head -3
root:0:0:/bin/bash
bin:1:1:/sbin/nologin
daemon:2:2:/sbin/nologin

[root@kd-csy-kvm-host /]# ifconfig |head -n2 |tail -n1|cut -d" " -f10
192.168.0.166
[root@kd-csy-kvm-host /]# ifconfig |head -n2 |tail -n1|tr -s " " |cut -d " " -f3
192.168.0.166

df | tr -s ' ' % |cut -d% -f5 |tr -d '[:alpha:]'
df | cut -c44-46 |tr -d '[:alpha:]'
cut -d: -f1,3,7 --output-delimiter="---" /etc/passwd
df|tr -s ' ' |cut -d' ' -f5 |tr -d %
df|tr -s ' ' '%'|cut -d% -f5

2.5 paste 合并多个文件

paste 合并多个文件同行号的列到一行

格式:

paste [OPTION]... [FILE]...

-d 分隔符:指定分隔符,默认用TAB

-s : 所有行合成一行显示

[root@kd-csy-kvm-host /]# paste /etc/fstab /etc/issue
	\S
#	Kernel \r on an \m
# /etc/fstab	
# Created by anaconda on Thu Apr 29 02:47:48 2021	
#	
# 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.	
#	
# After editing this file, run 'systemctl daemon-reload' to update systemd	
# units generated from this file.	
#	
/dev/mapper/cl_kd--csy--kvm--host-root /                       xfs     defaults        0 0	
UUID=ebdd101d-a583-4f25-8208-9f33140b6800 /boot                   xfs     defaults        0 0	
/dev/mapper/cl_kd--csy--kvm--host-swap none                    swap    defaults        0 0

2.6 分析文本的工具

文本数据统计:wc

整理文本:sort

比较文件:diff和patch

2.6.1 收集文本统计数据wc

wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数

可以对文件或STDIN中的数据统计

常用选项

-l 只计数行数

-w 只计数单词总数

-c 只计数字节总数

-m 只计数字符总数

-L 显示文件中最长行的长度

[root@kd-csy-kvm-host /]# wc /etc/fstab 
 14   72     609    /etc/fstab
行数 单词数 字节数	    文件名

[root@kd-csy-kvm-host /]# df | tail -n $(echo `df | wc -l`-1|bc)
devtmpfs                                 8015440        0   8015440   0% /dev
tmpfs                                    8036756        0   8036756   0% /dev/shm
tmpfs                                    8036756    17160   8019596   1% /run
tmpfs                                    8036756        0   8036756   0% /sys/fs/cgroup
/dev/mapper/cl_kd--csy--kvm--host-root 451519072 42488424 409030648  10% /
/dev/sda1                                 323232   189116    134116  59% /boot
tmpfs                                    1607348        0   1607348   0% /run/user/0

2.6.2 文本排序sort

把整理过的文本显示在STDOUT,不改变原始文件

格式:

sort [options] file(s)

常用选项

-r 执行反方向(由上至下)整理

-R 随机排序

-n 执行按数字大小整理

-f 选项忽略(fold)字符串中的字符大小写

-u 选项(独特,unique),合并重复项,即去重

-t c 选项使用c做为字段界定符

-k # 选项按照使用c字符分隔的 # 列来整理能够使用多次

[root@kd-csy-kvm-host /]# cut -d: -f1,3 /etc/passwd|sort -t: -k2 -nr |head -n3
nobody:65534
systemd-coredump:999
polkitd:998

cut -d" " -f1 /var/log/nginx/access_log |sort -u|wc -l

#查看分区利用率最高值
df| tr -s ' ' '%'|cut -d% -f5-6 |sort -nr|head -1

#查看所有分区利用率,从小到大排列
[root@kd-csy-kvm-host /]# df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -n

0
0
0
0
1
10
59

2.6.3 去重uniq

uniq命令从输入中删除前后相接的重复的行

格式:

uniq [OPTION]... [FILE]...

常见选项:

-c: 显示每行重复出现的次数

-d: 仅显示重复过的行

-u: 仅显示不曾重复的行

uniq常和sort 命令一起配合使用:

sort userlist.txt | uniq -c
#统计日志访问量最多的请求
[root@test-ap-port logs]# cut -d" " -f1 access.log |sort |uniq -c|sort -nr |head -3
  10344 47.111.166.20
  10340 47.93.20.138
  10338 47.105.211.113
#统计错误的登录列表排名
lastb -f /var/log/btmp | tr -s ' ' |cut -d ' ' -f3|sort |uniq -c|sort -nr | head -3

#统计排名前3的连接数
netstat -nt |tr -s " " : |cut -d: -f6 |sort |uniq -c |sort -nr |head -3

lastb用法:
	lastb [OPTION]... [FILE]...

-a:把从何处登入系统的主机名称或ip地址显示在最后一行;
-d:将IP地址转换成主机名称;
-f<记录文件>:指定记录文件;
-n<显示列数>或-<显示列数>:设置列出名单的显示列数;
-R:不显示登入系统的主机名称或IP地址;
-x:显示系统关机,重新开机,以及执行等级的改变等信息。

#统计并发连接最多的远程主机IP
ss -nt|tail -n+2 |tr -s ' ' : |cut -d: -f6|sort|uniq -c|sort -nr |head -n2

#取文件的共同行
[root@centos8 data]#cat test1.txt test2.txt | sort |uniq -d
1
b
c
#取文件的不同行
[root@centos8 data]#cat test1.txt test2.txt | sort |uniq -u
2
a
e
f

2.6.4 比较文件

2.6.4.1 diff

diff详解

diff 命令的输出被保存在一种叫做“补丁”的文件中

使用 -u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件

diff 命令比较两个文件之间的区别

diff分析两个文件,并输出两个文件的不同的行。diff的输出结果表明需要对一个文件做怎样的操作之后才能与第二个文件相匹配。diff并不会改变文件的内容,但是diff可以输出一个ed脚本来应用这些改变。
现在让我们来看一下diff是如何工作的,假设有两个文件:

//file1.txt
I need to buy apples.
I need to run the laundry.
I need to wash the dog.
I need to get the car detailed.

//file2.txt
I need to buy apples.
I need to do the laundry.
I need to wash the car.
I need to get the dog detailed.

使用diff比较他们的不同:
diff file1.txt file2.txt

输出如下结果:
2,4c2,4
< I need to run the laundry.
< I need to wash the dog.
< I need to get the car detailed.
---
> I need to do the laundry.
> I need to wash the car.
> I need to get the dog detailed.

该输出结果的含义,diff描述两个文件不同的方式是告诉我们怎么样改变第一个文件之后与第二个文件匹配。我们看看上面的比较结果中的第一行 2,4c2,4 前面的数字2,4表示第一个文件中的行,中间有一个字母c表示需要在第一个文件上做的操作(a=add,c=change,d=delete),后面的数字2,4表示第二个文件中的行。

2,4c2,4 的含义是:第一个文件中的第[2,4](注意这是一个闭合区间,包括第2行和第4行)需要做出修改才能与第二个文件中的[2,4]行相匹配。
接下来的内容则告诉我们需要修改的地方,前面带 < 的部分表示左边文件的第[2,4]行的内容,而带> 的部分表示右边文件的第[2,4]行的内容,中间的 --- 则是两个文件内容的分隔符号。

[root@kd-csy-kvm-host base]# diff a.txt b.txt 
1c1
< a
---
> aa
3c3
< c
---
> cc
4a5,6
> e
> FF
[root@kd-csy-kvm-host base]# cat a.txt 
a
b
c
d
[root@kd-csy-kvm-host base]# cat b.txt 
aa
b
cc
d
e
FF
[root@kd-csy-kvm-host base]# 

[root@kd-csy-kvm-host base]# diff -u a.txt b.txt 
--- a.txt	2021-05-08 16:22:48.771835390 +0800
+++ b.txt	2021-05-08 16:23:03.053620677 +0800
@@ -1,4 +1,6 @@
-a
+aa
 b
-c
+cc
 d
+e
+FF

diff一些有用的参数
diff还提供了一些有用的参数来控制比较行为与输出结果,一些常用的参数如下:
-b --ignore-space-change 忽略空格,如果两行进行比较,多个连续的空格会被当作一个空格处理,同时会忽略掉行尾的空格差异。
-w --ignore-all-space 忽略所有空格,忽略范围比-b更大,包括很多不可见的字符都会忽略。
-B 忽略空白行。
-y 输出两列,一个文件一列,有点类似GUI的输出外观了,这种方式输出更加直观。
-W 大写W,当指定-y的时候设置列的宽度,默认是130
-x, --exclude=PAT 比较目录的时候排除指定PAT模式的文件名的比较
-i, --ignore-case 忽略两个文件中大小写的不同
-e 将比较的结果保存成一个ed脚本,之后ed程序可以执行该脚本文件,从而将file1修改成与file2的内容相同,这一般在patch的时候有用。
-r 如果比较两个目录,-r参数会比较其下同名的子目录
-q 输出结果中,只指出两个文件不同,而不输出两个文件具体内容的比较,这在比较两个目录的时候很好用。我们只需要知道两个目录下那些文件做了修改,而不需要知道每个文件具体修改了那些内容。特别是当两个目录文件很多的时候。

diff -e 1.txt 2.txt > script.txt
这样就是生成了一个ed可以执行的脚本文件script.txt,生成脚本文件之后我们还需要做一个操作, 在脚本文件末尾添加ed的write指令,只需要执行 echo "w" >>script.txt 将w指令附加到脚本文件的最后一行即可。
那么如何应用该脚本文件呢,可以这样使用:
ed - 1.txt < script.txt
注意中间的 – 符号表示从标准输入中读取,而 < script.txt 则重定向script.txt的内容到标准输入。这样执行之后1.txt的内容将与2.txt完全相同。

2.6.4.2 patch

patch 复制在其它文件中进行的改变(要谨慎使用)

适用 -b 选项来自动备份改变了的文件

[root@kd-csy-kvm-host base]# diff -u a.txt b.txt > diff.log
[root@kd-csy-kvm-host base]# cat diff.log 
--- a.txt	2021-05-08 16:22:48.771835390 +0800
+++ b.txt	2021-05-08 16:23:03.053620677 +0800
@@ -1,4 +1,6 @@
-a
+aa
 b
-c
+cc
 d
+e
+FF
[root@kd-csy-kvm-host base]# rm -rf b.txt 

# 先使用-b选项备份原来的a.txt文件,然后使用校验文件diff.log重新生成a.txt,此时的a.txt其实是b.txt的内容!!!

[root@kd-csy-kvm-host base]# patch -b a.txt diff.log
patching file a.txt
[root@kd-csy-kvm-host base]# cat a.txt.orig 
a
b
c
d
[root@kd-csy-kvm-host base]# cat a.txt
aa
b
cc
d
e
FF

3 正则表达式

REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)
不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配
符功能是用来处理文件名,而正则表达式是处理文本内容中字符
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
正则表达式分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块,如:PCRE(Perl Compatible Regular
Expressions)
正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组
帮助:man 7 regex

3.1 基本正则表达式元字符

3.1.1 字符匹配
. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

3.2.2 次数匹配
	用在要指定次数的字符后面,用于指定前面的字符要出现的次数
. 皮牌前面字符一次
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
\{n\} 匹配n次
\{n,\}匹配前面的字符至少n次
\{,n\}匹配前面字符至多n次
\{m,n\} 至少m,至多n次
		#反斜杠在此处是转义的意思!

3.2.3 位置锚定
	定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^pattern$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\<, \b 语首锚定,用于单词模式的左侧
\>, \b 语尾锚定,用于单词模式的右侧
\<pattern\> 匹配整个单词

[root@kd-csy-kvm-host ~]# grep -v ^# /etc/fstab 

/dev/mapper/cl_kd--csy--kvm--host-root /                       xfs     defaults        0 0
UUID=ebdd101d-a583-4f25-8208-9f33140b6800 /boot                   xfs     defaults        0 0
/dev/mapper/cl_kd--csy--kvm--host-swap none                    swap    defaults        0 0
[root@kd-csy-kvm-host ~]# grep  ^# /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Thu Apr 29 02:47:48 2021
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
[root@kd-csy-kvm-host ~]# grep  ^[^#] /etc/fstab 
/dev/mapper/cl_kd--csy--kvm--host-root /                       xfs     defaults        0 0
UUID=ebdd101d-a583-4f25-8208-9f33140b6800 /boot                   xfs     defaults        0 0
/dev/mapper/cl_kd--csy--kvm--host-swap none                    swap    defaults        0 0

[root@kd-csy-kvm-host ~]# echo "hello,world" |grep "\bhello"
hello,world
[root@kd-csy-kvm-host ~]# echo "hello,world" |grep "\bhello\b"
hello,world
[root@kd-csy-kvm-host ~]# echo "hello,world" |grep "\bworld"
hello,world
[root@kd-csy-kvm-host ~]# echo "hello,world,hello" |grep "\bhello\b"
hello,world,hello

3.2.4 分组其它
		分组:将一个或多个字符捆绑在一起,当作一个整体;分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,...

\1:表示 从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

() 分组
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

echo rootrootroot |grep "\(root\)\{3\}"	

#统计/etc/passwd所有的2到3位数字
[root@kd-csy-kvm-host ~]# grep -o "\<[0-9]\{2,3\}\>" /etc/passwd

#查看当前的系统版本
[root@kd-csy-kvm-host ~]# grep -o '\<[0-9]\+\>' /etc/redhat-release |head -1

#查找用户名和bash相同的用户
[root@kd-csy-kvm-host ~]# grep "^\([^:]\+\):.*\<\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

#统计磁盘的使用率并排序
[root@kd-csy-kvm-host ~]# df -TH |grep "^/dev" |grep -o '[[:digit:]]\+%' |sort -nr
59%
10%

3.2 扩展正则表达式

		egrep = grep -E

		egrep [options] pattern [file...]

3.2.1 字符匹配元字符
. 任意单个字符
[wang] 指定范围的字符
[^wang] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

3.2.2 次数匹配
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次

3.2.3 位置锚定
^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾

3.2.4 分组其它
() 分组
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

4 文本处理三剑客

grep 命令主要对文本的(正则表达式)行基于模式进行过滤

sed:stream editor,文本编辑工具

awk:Linux上的实现gawk,文本报告生成器

4.1 文本处理三剑客之 grep

grep: Global search REgular expression and Print out the line

作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行

模式:由正则表达式字符及文本字符所编写的过滤条件

格式:

grep [OPTIONS] PATTERN [FILE...]

常见选项:

–color=auto 对匹配到的文本着色显示

-m # 匹配#次后停止

-v 显示不被pattern匹配到的行

-i 忽略字符大小写

-n 显示匹配的行号

-c 统计匹配的行数

-o 仅显示匹配到的字符串

-q 静默模式,不输出任何信息

-A # after, 后#行

-B # before, 前#行

^ 行首

$ 行尾

<, \b 语首

, \b 语尾

() 分组

后向引用:\1, \2, …

| 或者

a|b #a或b

C|cat #C或cat

(C|c)at #Cat或cat

grep [OPTIONS] PATTERN [FILE…]

-C # context, 前后各#行

-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ file

-w 匹配整个单词

-E 使用ERE,相当于egrep

-F 不支持正则表达式,相当于fgrep

-f file 根据模式文件处理

-r 递归目录,但不处理软链接

-R 递归目录,但处理软链接

grep linux
#直接输出过滤内容,不加任何选项,则是标准输出模式,等待屏幕输出再匹配

grep root /etc/passwd
grep "USER" /etc/passwd
grep 'USER' /etc/passwd
grep `whoami` /etc/passwd

单引号:所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。单引号''是全引用,被单3引号括起的内容不管是常量还是变量者不会发生替换。
双引号:把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。
不加引号:不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。
使用规则:一般常量用单引号''括起,如果含有变量则用双引号""括起。最大不同:单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般字元,而不会有特殊符号

Tips:
	使用nmap工具扫描当前网络中所有主机,并使用grep过滤中当前活跃主机!
		nmap -v -sP 192.168.0.0/24 > nmap.log
		grep -B1 up nmap.log |grep report |cut -d " " -f5
		
	df -TH |grep "/dev/"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值