如何grep第n个字符串

how to grep nth string

如何使用 "grep" shell 命令显示以特定单词开头的行中的特定单词。

例如: 我想从下面提到的行中以 searchStr 开头的行打印一个字符串 "myFTPpath/folderName/"

searchStr:somestring:myFTPpath/folderName/:somestring

awk 类似:

awk -F: '/^searchStr/{print }' File

从所有以 searchStr 开始的行中,打印 3rd 字段(字段分隔符设置为 :

样本:

AMD$ cat File
someStr:somestring:myFTPpath/folderName/:somestring
someStr:somestring:myFTPpath/folderName/:somestring
searchStr:somestring:myFTPpath/folderName/:somestring
someStr:somestring:myFTPpath/folderName/:somestring
AMD$ awk -F: '/^searchStr/{print }' File
myFTPpath/folderName/

请记住,grep 并不是唯一可以有效进行搜索的工具。

在这种特殊情况下,行自然地分成字段,awk 可能是最好的解决方案,正如@A.M.D 的回答所暗示的那样。

然而,对于更一般的案例编辑,请记住 sed-n 选项,它禁止在编辑后打印出一行:

sed -n 's/searchStr:[^:]*:\([^:]*\):.*//p' input-file

-n 禁止自动打印该行,尾随的 /p 标志显式打印出其中 替换的行。

这种匹配模式很复杂——在这种情况下使用awk——但不要忘记sed -n

您可以使用 grep 本身获得所需的输出,但您需要启用 -P-o 参数。

$ echo 'searchStr:somestring:myFTPpath/folderName/:somestring' | grep -oP '^searchStr:[^:]*:\K[^:]*'
myFTPpath/folderName/

\K 在最后打印时丢弃先前匹配的字符,只留下与 \K 旁边存在的模式匹配的字符。这里我们使用 \K 而不是可变长度的正向后视断言。