AWK获取特定模式

AWK获取特定模式,awk,Awk,我有这样的台词: Volume.Free_IBM_LUN59_28D: 2072083693568 我只想使用awk从这条生产线获得IBM_LUN59_28D 谢谢您可以使用sub对每个输入行进行替换,如下所示: pax> echo 'Volume.Free_IBM_LUN59_28D: 2072083693568' | awk ' ...> { ...> sub (".*Free_", ""); ...> sub (":.*", "

我有这样的台词:

Volume.Free_IBM_LUN59_28D:      2072083693568
我只想使用awk从这条生产线获得IBM_LUN59_28D


谢谢

您可以使用
sub
对每个输入行进行替换,如下所示:

pax> echo 'Volume.Free_IBM_LUN59_28D:      2072083693568' | awk '
...> {
...>     sub (".*Free_", "");
...>     sub (":.*", "");
...>     print
...> }'
IBM_LUN59_28D
该命令跨越多行以提高可读性,但如果您正在对文件进行操作,并且不太关心可读性,则可以使用压缩版本:

awk '{sub(".*Free_","");sub(":.*","");print}' inputFile
如果您愿意接受非
awk
解决方案,您还可以使用
sed

sed -e 's/.*Free_//' -e 's/:.*//' inputFile

请注意,这两种解决方案都依赖于您的(稍微稀疏的)测试数据。如果“like”的定义包括前面的文本段(而非
自由字符)或后面的字符(而非
),则可能需要做更多的工作

例如,如果您想要在第一个
\uu
和第一个
之间的字符串,可以使用:

awk '{sub("[^_]*_","");sub(":.*","");print}'

使用sedsed

sed 's/[^_]*_\(.*\):.*/\1/'
echo "$val" | awk -F: '{print $1}' | awk -F. '{print $2}' | awk '{print substr($0,6)}'
搜索非
\uu
字符序列,后跟
\u
(这将匹配
Volume.Free\u
),然后是另一个字符序列(这将匹配IBM\u LUN59\u 28D,我们将其分组以备将来使用),然后是
和任何字符序列。替换为保存的模式(
\1
)。就这样

示例:

$ echo "Volume.Free_IBM_LUN59_28D:      2072083693568" | sed 's/[^_]*_\(.*\):.*/\1/'
IBM_LUN59_28D

这里有一个
awk

awk -F"Free_" 'NF>1{split($2,a,":");print a[1]}'
Eks:

它将行除以
自由

如果行有多个字段
NF>1

分秒字段bye
并使用awk打印第一部分
a[1]

sed 's/[^_]*_\(.*\):.*/\1/'
echo "$val" | awk -F: '{print $1}' | awk -F. '{print $2}' | awk '{print substr($0,6)}'
其中给定字符串的单位为$val