bash - grep (fgrep) bash 精确匹配行尾

标签 bash awk grep

我有下面的示例文件

d41d8cd98f00b204e9800998ecf8427e  /home/abid/Testing/FileNamesTest/apersand $ file
d41d8cd98f00b204e9800998ecf8427e  /home/abid/Testing/FileNamesTest/file[with square brackets]
d41d8cd98f00b204e9800998ecf8427e  /home/abid/Testing/FileNamesTest/~$tempfile
017a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThree
217a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThreeDays
d41d8cd98f00b204e9800998ecf8427e  /home/abid/Testing/FileNamesTest/single quote's

我想 grep 文件的最后部分(文件名),但我需要与该行的最后部分(文件名)完全匹配

grep FileThree$ files.md5
017a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThree

返回精确匹配,但找不到“FileThreeDays”,这就是我想要的,但因为某些文件名包含方括号,所以我必须使用 grep -F 或 fgrep。然而,像上面这样使用 fgrep 不起作用,它什么也不返回。

如何使用 fgrep 精确匹配该行的最后一部分,同时仍然尊重上面的特殊字符 ~/$/'/[ ] 等...或使用 awk 的任何其他方法...

进一步....

使用 fgrep 而不返回这两个文件我只想要完全匹配(使用上面的 $ 与 grep),但 $ 与 fgrep 不返回任何内容。

 grep -F FileThree files.md5
017a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThree
217a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThreeDays

最佳答案

我无法说出您问题的所有详细信息,但听起来您可以使用 grep 并转义特殊字符:grep 'File\[Three\]Days$'

如果您想使用 fgrep,您可以使用一些 tr 技巧来帮助您。如果您想要的只是文件名(没有目录名),您可以执行类似的操作

cat files.md5 | tr '/' '\n' | fgrep FileThreeDays

tr 命令用换行符替换斜杠,因此它将每个文件名放在自己的行上。这意味着 fgrep 在搜索 FileThreeDays 时只会找到文件名。

如果您想要带有目录的完整文件名,则有点棘手,但类似的方法也可以。假设 SHA 和文件名之间始终有一个双空格,并且没有任何文件名中包含双空格或制表符,您可以尝试如下操作:

sed 's/  /\t' files.md5 | tr '\t' '\n' | fgrep FileThreeDays

该 sed 命令将双空格转换为制表符。 tr 命令将这些选项卡转换为换行符(与上面相同的技巧)。

关于bash - grep (fgrep) bash 精确匹配行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30558459/

相关文章:

linux - grep 仅在 ":"之后的文本

bash - 在unix中获取环境变量的值

bash - 将select操作的结果输出到一个数组中——jq

python - 优化多个 sed 语句

bash - 比较不同文件中的两列并为共享项追加数据 - UNIX

bash - Sed 发现自己并丢弃脚本结果

grep - 抓取网站并仅返回 URL

regex - 如何从多行文件中提取子字符串

linux - 加载已经插入内核的usb驱动

awk - 订购一列然后在命令行中使用 awk 打印特定行