正则表达式 与 grep awk sed 文本三剑客

正则表达式是一种用于匹配和处理文本模式的强大工具。在Shell脚本中,你可以使用正则表达式来进行文本的匹配、搜索和过滤。以下是关于正则表达式的内容:

正则表达式

正则表达式是一种用于描述文本模式的工具,它可以用于在文本中搜索、匹配和处理特定模式的字符串。在Shell脚本中,你可以使用正则表达式来执行各种文本操作,如搜索、替换、提取等。

元字符(字符匹配)

正则表达式中的元字符用于匹配特定的字符或字符集。一些常见的元字符包括:

  • .:匹配任意字符。

  • []:定义字符集,匹配其中的任意字符。

  • [^]:字符集取反,匹配不在其中的字符。

  • -:定义字符范围,如 [0-9] 表示匹配数字字符。

  • ():分组,可以将多个元素组合在一起进行匹配。

  • |:或操作,匹配多个选择中的任意一个。

  • 你提供的信息是关于正则表达式中的字符类,这些字符类用于匹配特定类型的字符。它们可以在正则表达式中用来定义模式,以便进行更精确的文本匹配和处理。以下是对你提供的不同字符类的解释:

  • [:alnum:]:匹配字母和数字字符。

  • [:alpha:]:匹配任何英文大小写字符,即A-Z和a-z。

  • [:lower:]:匹配小写字母,相当于[a-z]

  • [:upper:]:匹配大写字母。

  • [:blank:]:匹配空白字符,包括空格和制表符。

  • [:space:]:匹配各种空白字符,包括空格、制表符(水平和垂直方向)、换行符、回车符等。

  • [:cntrl:]:匹配不可打印的控制字符,如退格、删除、警铃等。

  • [:digit:]:匹配十进制数字。

  • [:xdigit:]:匹配十六进制数字。

  • [:graph:]:匹配可打印的非空白字符。

  • [:print:]:匹配可打印字符。

  • [:punct:]:匹配标点符号。

此外,\w 匹配单词构成部分,等价于[_[:alnum:]],而\W匹配非单词构成部分,等价于[^_[:alnum:]]\S匹配任何非空白字符,等价于[^ \f\n\r\t\v],而\s匹配任何空白字符,包括空格、制表符、换页符等,等价于[ \f\n\r\t\v]

这些字符类和转义符在正则表达式中非常有用,可以帮助你在处理文本时更准确地匹配所需的内容。通过结合这些字符类,你可以构建更复杂和灵活的正则表达式模式,以满足不同的匹配需求。

表示次数

正则表达式中可以使用以下元字符来表示字符出现的次数:

  • *:匹配前一个字符出现 0 次或多次。
  • +:匹配前一个字符出现 1 次或多次。
  • ?:匹配前一个字符出现 0 次或 1 次。
  • {n}:匹配前一个字符出现恰好 n 次。
  • {n,}:匹配前一个字符出现至少 n 次。
  • {n,m}:匹配前一个字符出现 n 到 m 次。

位置锚定

位置锚定用于指定匹配发生的位置:

  • ^:匹配行的开头。
  • $:匹配行的结尾。
  • \b:匹配单词的边界。
  • \B:匹配非单词边界。

分组或其他

正则表达式中可以使用分组和其他特性来构建更复杂的模式:

  • ():分组,用于将一组元素组合在一起。
  • \1, \2, ...:反向引用,用于匹配之前的分组。
  • (?i):不区分大小写匹配。
  • (?x):忽略空白和注释。

扩展正则表达式

扩展正则表达式增加了一些功能,但在某些环境中可能需要特定的标志来启用扩展功能。一些扩展功能包括:

  • +?|() 的特殊含义,需要使用\ 转义。
  • {} 的特殊含义,需要使用\{\} 转义。

通过学习和理解正则表达式,你可以在Shell脚本中更高效地处理文本数据,实现各种匹配、搜索和过滤操作。正则表达式在数据处理和文本分析中非常有用,尤其是当需要从大量文本中提取特定信息时。
当使用正则表达式进行文本过滤时,以下是一个简单的案例,演示了如何在一段文本中查找并提取所有包含"apple"的单词:

假设我们有以下文本:

I have an apple, a banana, and an orange. The apple is red.

我们想从中提取所有包含"apple"的单词。可以使用grep命令来实现:

echo "I have an apple, a banana, and an orange. The apple is red." | grep -o '\bapple\b'

在这个案例中,grep -o '\bapple\b'使用正则表达式 \bapple\b 来匹配所有单词"apple",并使用 -o 参数来只输出匹配的部分。
在这里插入图片描述
执行以上命令,输出将会是:

apple
apple

文本三剑客

grep

grep [选项]… 查找条件 目标文件

  • -i:查找时忽略大小写
  • -v:反向查找,输出与查找条件不相符的行
  • -o 只显示匹配项
  • -f 对比两个文件的相同行
  • -c 匹配的行数([root@localhost ky15]# grep -c root passwd 2)

grep 是一个在 Unix 或类 Unix 系统中用于在文本文件中搜索指定字符串模式的命令。以下是一些 命令的使用案例:

例如,要在名为 “file.txt” 的文件中搜索字符串 “example”,可以运行:

grep "root"    /etc/fstab

在这里插入图片描述
则会输出

/dev/mapper/centos-root /                       xfs     defaults        0 0
含有root的行

上面例子不够清晰 下面的例子更为清晰

grep "nologin" /etc/passwd

在这里插入图片描述

  1. 忽略大小写:
    使用 -i 选项来忽略大小写。

    grep -i "pattern" filename
    
  2. 显示行号:
    使用 -n 选项来显示匹配行的行号。

grep    -n   "nologin" /etc/passwd

效果如图
在这里插入图片描述

  1. 显示匹配的次数:
    使用 -c 选项来显示匹配的次数。
  grep    -c   "nologin" /etc/passwd

在这里插入图片描述

  1. 显示匹配的上下文:
    使用 -A-B-C 选项来显示匹配行的上下文。

    • -A:显示匹配行及其后面的几行。
    • -B:显示匹配行及其前面的几行。
    • -C:显示匹配行及其前后的几行。
     grep    -A2   "nologin" /etc/passwd
    

在这里插入图片描述

  1. 递归搜索:
    使用 -r-R 选项在目录及其子目录中递归搜索。

    grep -r "pattern" directory
    
  2. 排除文件:
    使用 --exclude--exclude-dir 选项来排除特定的文件或目录。

    grep "pattern" directory --exclude="*.txt"
    
  3. 使用正则表达式:
    使用 -E 选项来启用扩展的正则表达式匹配。

    grep -E 
    

    也可以是

    egrep 
    

9.管道符|可以传递其它命令的标准输出给grep

例如
提取IP地址
ifconfig | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
ifconfig | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"|head -n 1

AWK

awk 基础用法
print 动作
抓取列
如     查看分区使用情况 df|awk '{print $5}'
print $5 代表输出第五列
awk -F: '{print $1,$3}' /etc/passwd
则代表输出/etc/passwd文件的第一列和第三列
df|awk '{print $5}'

在这里插入图片描述
-F 指定分隔符
如图
在这里插入图片描述
以:为分割符提取地5行

cat /etc/passwd|awk -F ':' '{print $5}'

在这里插入图片描述
awk 提取IP

ifconfig |awk '/netmask/{print$2}'|head -n 1

在这里插入图片描述
在这里插入图片描述

还可以配合正则表达式使用

awk '/^root/{print}'    /etc/passwd 

可以显示passwd文件内以 root开头的行
在这里插入图片描述

awk 常见的内置变量
  • FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v “FS=:”
  • OFS:输出时的分隔符
  • NF:当前处理的行的字段个数
  • NR:当前处理的行的行号(序数)
  • $0:当前处理的行的整行内容
  • $n:当前处理行的第n个字段(第n列)
  • FILENAME:被处理的文件名
  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

sed

sed 的基本用法
sed [option]... 'script;script;...' [input  file...]
     选项         自身脚本语法         支持标准输入管道
sed '' /etc/fstab   查看fstab的全文

在这里插入图片描述

#显示/etc/fstab   文件的第三行      -n   是关闭默认打印模式     ‘’里的3 代表第四行      
#''里的p是打印
sed -n '4p'   /etc/fstab

效果如图,fstab第一行是空行
在这里插入图片描述

搜索替代
sed 's/apple/banana/g' 文件名

演示文件
在这里插入图片描述
在这里插入图片描述
可以通过

sed -i   -n  ' 行数 s/需要修改的字符  / 修改成的字符/ p'

面交互修改文件内容
在这里插入图片描述

这里吧5行 第一个asd 修改成 yes

sed   -i   '5s/asd/yes/'

在这里插入图片描述
如果要全替换 在后面加g即可

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值