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

Aux*_*ive 1 unix linux bash sed

所以,我试图在/ 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
Run Code Online (Sandbox Code Playgroud)

让我们说我正在寻找'史密斯'这个词?我如何才能在包含名称的第5个字段中查找它,而不是查看整个行?

我可以用awk轻松做到这一点,但我被要求用sed来做这件事.

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

使用sed将输出写入文件没有问题,我只是坚持我应该只在第5场中查找.Awk将使用5美元,但我找不到与sed类似的东西.

没有找到一个完整的答案交给我,而是寻求正确的方向.

and*_*lrc 5

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

awk '$5 ~ /smith|jones/{print}' /etc/passwd > output.txt
Run Code Online (Sandbox Code Playgroud)

但既然你要求sed解决方案,那么你可以使用这样的东西:

sed -n '/[^:]*:[^:]*:[^:]*:[^:]*:\(smith\|jones\)/p' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

每个人[^:]*将匹配所有但:零次或多次.

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

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

正如您所看到的,这将有助于您进一步简化正则表达式.

-n默认情况下不打印,/pattern/p将打印所有匹配的内容pattern

您可能要添加其他[^:]*之前\(smith\|jones\),如果你想匹配的用户名,如中间:

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

会匹配SmithJones.

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

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

传统上GNU sed用于-r启用ERE和BSD sed用途-E.然而GNU sed支持该-E标志,即使它没有文档.