我有以下示例文件
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
答案 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