0

我有一个字符串:

The disk 'virtual memory' also known as 'Virtual Memory' has exceeded the maximum utilization threshold of 95 Percent.

我需要每次都在这个字符串单词中搜索The disk,如果找到,那么我只需要提取短语'*' also known as '*'并将其放入变量中MONITOR

换句话说,我想搜索并将值放入

MONITOR="'virtual memory' also known as Virtual Memory'"

我该怎么做awk

4

2 回答 2

1

这是一个片段,可以满足您的描述。您应该将其放入$(...)以将其分配给 $MONITOR 变量:

$ awk '/The disk '\''.*'\'' also known as '\''.*'\'' has exceeded/ {gsub(/The disk /,"");gsub(/ has exceeded.*$/,"");print}' input.txt

在这种情况下,awk 的两个问题是

  • 它的正则表达式没有子匹配提取(这就是为什么我的解决方案gsub()在正文中使用以摆脱该行的第一部分和最后一部分。
  • 要在 shell 脚本中使用 awk 正则表达式中的引号,您需要'\''序列来对其进行转义(更多信息在这里
于 2013-02-11T15:18:45.143 回答
0

sed使用than可能会更容易一些awk

string="The disk 'virtual memory' also known as 'Virtual Memory' has exceeded the maximum utilization threshold of 95 Percent."

MONITOR=$(echo "$string" | sed -n "/The disk \('[^']*' also known as '[^']*'\) .*/s//\1/p")

如果awk有必要,那么:

MONITOR=$(echo "$string" | awk "/The disk '[^']*' also known as '[^']*'/ {
                                print \$3, \$4, \$5, \$6, \$7, \$8, \$9; } {}')

空大括号{}匹配任何行并且不打印任何内容,因此awk只处理匹配正则表达式的行。请注意,这假设每个磁盘都有一个名称,其中包含两个单词。您需要使用更强大的处理(gsub例如函数)来进行基于正则表达式的替换。这不是awk强项;sed更容易用于该任务。

这两个命令都设置为处理穿插不匹配行的多行数据(但也适用于包含匹配信息的单行)。仅在单独的行上打印引号之间的名称也不是很困难,因此您之后要做的剖析更少(以获得两个以空格分隔的名称)。

于 2013-02-11T15:23:14.473 回答