正则表达式是一种用于匹配和处理文本模式的强大工具。在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
-
忽略大小写:
使用-i
选项来忽略大小写。grep -i "pattern" filename
-
显示行号:
使用-n
选项来显示匹配行的行号。
grep -n "nologin" /etc/passwd
效果如图
- 显示匹配的次数:
使用-c
选项来显示匹配的次数。
grep -c "nologin" /etc/passwd
-
显示匹配的上下文:
使用-A
、-B
或-C
选项来显示匹配行的上下文。-A
:显示匹配行及其后面的几行。-B
:显示匹配行及其前面的几行。-C
:显示匹配行及其前后的几行。
grep -A2 "nologin" /etc/passwd
-
递归搜索:
使用-r
或-R
选项在目录及其子目录中递归搜索。grep -r "pattern" directory
-
排除文件:
使用--exclude
或--exclude-dir
选项来排除特定的文件或目录。grep "pattern" directory --exclude="*.txt"
-
使用正则表达式:
使用-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即可