Grep(fgrep)bash完全匹配行

时间:2015-05-31 14:18:40

标签: 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

2 个答案:

答案 0 :(得分:2)

我无法告诉您问题的所有详细信息,但听起来您可以使用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命令将这些选项卡转换为换行符(与上面相同的技巧)。

答案 1 :(得分:2)

我会使用awk

awk '{$1="";print}' file

$1=""将第一列剪切为空字符串,print打印修改后的行 - 现在只包含文件名。

但是,这会在每行的开头留下一个空格。如果您关心它并想要将其删除,请将输出字段分隔符设置为空字符串:

awk '{$1="";print}' OFS="" file
相关问题