gpt4 book ai didi

linux - 使用 sed 匹配第 5 个字段中的文本

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:17 29 4
gpt4 key购买 nike

因此,我试图在/etc/passwd 的第 5 个字段中寻找某些词。例如:

jonesc:x:1053:1001:Cathy Jones:/export/home/jonesc:/bin/ksh
smiths:x:1049:1000:Sue Williams:/export/home/smiths:/bin/csh
smitha:x:1050:1001:Amy Smith:/export/home/smitha:/bin/bash

假设我正在寻找“Smith”这个词?我如何仅在包含名称的第 5 个字段中查找它,而不是查看整行?

我可以用 awk 轻松做到这一点,但我被要求用 sed 代替。

我被要求做的是将/etc/passwd 中第 5 个字段中包含 Smith 或 Jones 的匹配项输出到名为 smith_jones.txt 的文件中。

我对使用 sed 将输出写入文件没有任何问题,我只是坚持我应该如何只在第 5 个字段中查找。Awk 会使用 $5,但我找不到与 sed 类似的东西。

不是寻找交给我的完整答案,而是朝着正确方向的插入。

最佳答案

Awk 将是完成这项工作的正确工具:

awk '$5 ~ /smith|jones/{print}' /etc/passwd > output.txt

但是由于您要求的是 sed 解决方案,因此您可以使用类似这样的方法:

sed -n '/[^:]*:[^:]*:[^:]*:[^:]*:\(smith\|jones\)/p' /etc/passwd

其中每个 [^:]* 将匹配除 : 之外的所有内容零次或多次。

您还可以使用范围元序列重复之前的模式:\{x,y\}:

sed -n '/\([^:]*:\)\{4\}\(smith\|jones\)/p' /etc/passwd

如您所见,这将帮助您进一步简化正则表达式。

-n 默认不打印,/pattern/p 将打印匹配 pattern

的所有内容

如果你想匹配用户名的中间部分,你可能想在 \(smith\|jones\) 之前添加另一个 [^:]*,例如:

sed -n '/\([^:]*:\)\{4\}[^:]*\(th\|es\)/p' /etc/passwd

将匹配 SmithJones

正如评论中所指出的,您还可以使用扩展正则表达式来避免所有这些反斜杠:

sed -E -n '/([^:]*:){4}(smith|jones)/p' /etc/passwd

传统上 GNU sed 使用 -r 启用 ERE,而 BSD sed 使用 -E。然而,GNU sed 支持 -E 标志,即使它没有记录。

关于linux - 使用 sed 匹配第 5 个字段中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37104263/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com