【问题标题】:How to change grep and cut commands by only one awk/sed command in the following example?在以下示例中,如何仅通过一个 awk/sed 命令更改 grep 和 cut 命令?
【发布时间】:2014-05-06 16:47:17
【问题描述】:

我有一个文件包含:

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

如何仅通过一个sed 命令或awk 命令更改上述grepcut

【问题讨论】:

  • 恕我直言,尽可能使用更简单的解决方案(如cut)优于使用更复杂的解决方案(如awk)......虽然你可以摆脱catgrep =mmm myfile.txt).

标签: linux shell awk sed ash


【解决方案1】:

回答上一个问题:

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

回答当前问题:

$ awk -F'[.=]' '/aaa\.bbbb0\.xxxx[0-6]+=toto/ {print $3}' file
xxxx0
xxxx1

【讨论】:

  • 已完成,但我认为您的问题仍有问题。
  • 谢谢,这是最简单的 awk 表达式,它可以工作。
【解决方案2】:
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

【讨论】:

  • 可以用正则表达式改变=mmmm吗?
【解决方案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

【讨论】:

  • 灰不支持-oP选项。
  • @MOHAMED 我的错,我没有清楚地看到ash 标签。添加了awk 版本。
  • @MOHAMED 在问题中,您的输出与输入数据不同步。我添加了另一个选项,其输出与您在问题中的尝试相同。
猜你喜欢
  • 2021-03-29
  • 1970-01-01
  • 2020-06-24
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 2016-07-31
相关资源
最近更新 更多