文本处理工具及正规表达式
文章目录
- 文本处理工具及正规表达式
- 2 文本常见处理工具
- 2.1 文件内容查看命令
- 2.1.1 查看文本文件内容
- 2.1.1.1 cat
- 2.1.1.2 nl
- 2.1.1.3 tac
- 2.1.1.4 rev
- 2.2 分页查看文件内容
- 2.2.1 more
- 2.2.2 less
- 2.3 显示文本前或后行内容
- 2.3.1 head
- 2.3.2 tail
- 2.3.3 tr
- 2.4 按列抽取文本cut
- 2.5 paste 合并多个文件
- 2.6 分析文本的工具
- 2.6.1 收集文本统计数据wc
- 2.6.2 文本排序sort
- 2.6.3 去重uniq
- 2.6.4 比较文件
- diff一些有用的参数
- 2.6.4.2 patch
- 3 正则表达式
- 3.1 基本正则表达式元字符
- 3.1.1 字符匹配
- 3.2.2 次数匹配
- 3.2.3 位置锚定
- 3.2.4 分组其它
- 3.2 扩展正则表达式
- 3.2.1 字符匹配元字符
- 3.2.2 次数匹配
- 3.2.3 位置锚定
- 3.2.4 分组其它
- 4 文本处理三剑客
- grep 命令主要对文本的(正则表达式)行基于模式进行过滤
- sed:stream editor,文本编辑工具
- awk:Linux上的实现gawk,文本报告生成器
- 4.1 文本处理三剑客之 grep
文本处理工具及正规表达式
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/fstab3 # Created by anaconda on Thu Apr 29 02:47:48 20214 #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 systemd9 # units generated from this file.10 #11 /dev/mapper/cl_kd--csy--kvm--host-root / xfs defaults 0 012 UUID=ebdd101d-a583-4f25-8208-9f33140b6800 /boot xfs defaults 0 013 /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 PATHif [ $PPID -ne 1 -a -z "$SYSTEMCTL_SKIP_REDIRECT" ] && \[ -d /run/systemd/system ] ; thencase "$0" in/etc/init.d/*|/etc/rc.d/init.d/*)_use_systemctl=1;;esac
fisystemctl_redirect () {local slocal prog=${1##*/}local command=$2local 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.166df | 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:998cut -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 -n0
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 -310344 47.111.166.2010340 47.93.20.13810338 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 -3lastb用法: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
+aab
-c
+ccd
+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
+aab
-c
+ccd
+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或catecho 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 -Eegrep [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.loggrep -B1 up nmap.log |grep report |cut -d " " -f5df -TH |grep "/dev/"
文本处理工具及正规表达式相关推荐
- linux文件/文本处理工具
linux文件/文本处理工具 正则表达式 正则表达式是什么? 正则表达式如何使用 grep grep是什么 grep语法 grep使用案例 sed sed与vim的区别 sed语法 sed案例 fla ...
- 正则表达式与常用文本处理工具
正则表达式与常用文本处理工具 正则表达式概述 基础正则表达式 基础正则表达式元字符 扩展正则表达式 概述 扩展元字符 文本处理器 grep 示例 sed sed 命令 示例 输出文件内容 删除符合条件 ...
- 2019-8-20 [Linux] 6.Shell的基本操作 查看 改变 列出 阅读开头/结尾 循环查看 阅读工具less 查找文件内容 文本分析工具AWK 文本编辑工具SED文件find 帮助man
文章目录 6.linuxShell的基本操作 6.1 查看目录和文件 6.1.1 显示当前目录:pwd 6.1.2 改变目录:cd 6.1.3 列出目录内容:ls 1) 查看列表信息 以及详细信息 2 ...
- Linux正则与文本处理工具
正则表达式 (Regular Expression, RE, 或称为常规表达式)是通过一些特殊字符的排列,用于『查找/替换/删除』一行或多行文字或字符串,简单的说,正则表达式就是用在字串的处理上面的一 ...
- Linux命令:文本处理工具awk详解
awk命令简介: awk是一个强大的文本分析工具,通常,awk是以文件的每一行,为处理单位的.awk每接收文件的一行,然后执行相应的命令,来处理文本. 1.命令格式: awk 'pattern {a ...
- 【Linux】 字符串和文本处理工具 grep sed awk
Linux字符串&文本处理工具 因为用linux的时候主要用到的还是字符交互界面,所以对字符串的处理变得十分重要.这篇介绍三个常用的字符串处理工具,包括grep,sed和awk ■ grep ...
- linux shell find depth,搞定 Linux Shell 文本处理工具,看完这篇集锦就够了
原标题:搞定 Linux Shell 文本处理工具,看完这篇集锦就够了 Linux Shell是一种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替.既然是基本功,那就需要掌握,毕 ...
- linux文本分析工具awk解读
awk是一个强大的文本分析工具,相对于grep的查找.sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.awk把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. ...
- shell编程之文本处理工具awk
shell编程之文本处理工具awk 文章目录 shell编程之文本处理工具awk 一.awk介绍 1. awk概述 2. awk能干啥? 二.awk使用方式 1. ==命令行模式使用== ㈠ 语法结构 ...
最新文章
- fastJson,gosn使用小结
- jzoj1164-求和【欧拉函数,数论】(筛欧拉函数模板)
- oracle dba (适用,OracleDBA笔试题
- 设置手动双面打印_双面打印文档,你会吗?学会这几招,自动双面打印问题轻松解决...
- jsPlumb点到点连线偏移
- 【详解】服务可用性详细说明及其解决方案
- 第三届全国平面公益广告大赛暨全国大学生公益广告征集活动
- 微信小程序如何快速累计独立访客(UV)不低于 1000
- itext 导出pdf 图片太大
- 心情随笔:工作篇(半夜无眠,写与自己共勉)
- 计算机网络(第7版)第二章(应用层)知识点整理
- eclipse快捷键使用以及一些小机灵
- lda2vec (2)
- 判断二叉树是否为平衡二叉树(递归)
- 1185_SPC560B60L7_ADC0标准通道的Injected转换模式
- ViT强势应用 | V2X基于ViT提出了一个具有V2X通信的强大协作感知框架
- 我们期望的NFC手机方案
- 一道导数与不等式结合的题目
- react: 动态设置ant-design/icons图标
- Personalized Edge Intelligence via Federated Self-Knowledge Distillation, TPDS 2023