使用 sed 或 awk 的“grep | cut”相当于什么?

使用 sed 或 awk 的“grep | cut”相当于什么?

假设我有一个配置文件/etc/emails.conf

email1 = [email protected] 
email2 = [email protected]
email3 = [email protected]

我想收到电子邮件2

我可以做一个:

grep email2 /etc/emails.conf | cut -d'=' -f2 

获取 email2,但如何使用一个 sed 或 awk 命令“更酷”地完成它并删除 cut 命令留下的空白?

答案1

使用 awk 怎么样?

awk -F = '/email2/ { print $2}' /etc/emails.conf
  • -F =字段由“=”分隔

  • '/email2/ { print $2}'在与“email2”匹配的行上,打印第二个字段

答案2

精确的等效项是这样的:

sed -n '/email2/{s/^[^=]*=\([^=]*\).*/\1/;p;}' < file

但你可能想要:

sed -n 's/^[^=]*email2[^=]*=[[:blank:]]*//p' < file

(即email2仅匹配第一个之前的部分=,并返回第一个右侧的所有内容=(跳过前导空格),而不仅仅是第二个之前的部分(=如果有)。

答案3

perl -nlE 's/email2\s*=\s*// and say'    file

在哪里:

  • perl -nl 是每行做...
  • s/email2 = // 删除搜索到的电子邮件 ID,如果你可以这样做......
  • say打印当前输入的输入行
  • \s*零个或多个空格(相当于 [ \t\n]*)

答案4

无需将字段分隔符设置为任何特殊值,例如“=”。默认情况下,AWK 使用连续的空格和制表符作为字段分隔符,这些分隔符会被跳过,因此它将把文件的每一行解释为具有三个字段,而第三个字段上没有任何前导空格

awk '/^email2/ { print $3 }'

产生

[email protected]

上面也将匹配任何以 开头的行email2,例如email20,为了精确匹配,您可以使用

awk '$1 == "email2" { print $3 }'

相关内容