1

我有一个文件包含:

aaa.bbbb0.xxxx0=toto
aaa.bbbb0.xxxx1=toto
aaa.bbbb0.xxxx2=titi
eee.ffff.zzzz=kkkk

我想提取包含正则表达式的行"aaa\.bbbb0\.xxxx[0-6]\+=toto",然后提取路径中的第三个元素。所以输出应该是这样的

xxxx
yyyy

我可以使用grep然后cut以这种方式获得此输出:

cat myfile.txt | grep "aaa\.bbbb0\.xxxx[0-6]\+=toto" | cut -d'=' -f1 | cut -d'.' -f3

如何仅通过一个命令或grep命令更改上述内容?cutsedawk

4

3 回答 3

5

回答上一个问题:

awk -F'[.=]' '$4 ~ /^[[:digit:]]+$/ {print $3}' file

回答当前问题:

$ awk -F'[.=]' '/aaa\.bbbb0\.xxxx[0-6]+=toto/ {print $3}' file
xxxx0
xxxx1
于 2014-05-06T16:55:16.100 回答
4
awk -F[.=] '/=mmmm/{print $3}' input.txt

要匹配您第一次编辑的数据:

awk -F[=] '$2 ~ /^[0-9]+(\.[0-9]+)?$/{split($1,a,".");print a[3]}' input.txt

这也将匹配浮点数

并进行第二次编辑

awk -F= '/aaa\.bbbb0\.xxxx[0-6]+=toto/{split($1,a,".");print a[3]}' input.txt
于 2014-05-06T16:49:47.783 回答
3

使用grep -P选项启用 PCRE,您可以使用 Positive Lookahead 和 Lookbehind 获得输出。

$ cat file
aaa.bbbb.xxxx=4521
ccc.dddd.yyyy=7842
eee.ffff.zzzz=kkkk

$ grep -oP '(?<=\.)(\w+)(?==\d+$)' file
xxxx
yyyy 

另一种awk变体:

$ awk -F. '{split($3,a,/=/); if (a[2]~/^[[:digit:]]+$/) print a[1]}' file
xxxx
yyyy

基于更新的问题:

$ awk -F. '/aaa\.bbbb0\.xxxx[0-6]+=toto/{split($3,a,/=/); print a[1]}' file
xxxx0
xxxx1
于 2014-05-06T17:00:59.477 回答