我有一个包含以下内容的文件:
image_0001.jpg 0
image_1212.jpg 0
image_1324.jpg 1
image_1784.jpg 1
image_7867.jpg 10
image_1919.jpg 11
我希望找到一种方法来只获得与第二列中的数字匹配的行:
如果我要求“0”,那么只得到:
image_0001.jpg
image_1212.jpg
如果我要求“1”,那么只得到:
image_1324.jpg
image_1784.jpg
有没有办法用grep或awk做到这一点?到目前为止,当我grep为“1”时,我得到了10和11行
答案 0 :(得分:4)
你可以使用awk。
$ awk '$2=="1"{print $1}' file
image_1324.jpg
image_1784.jpg
仅当第2列的值恰好为1
时,才会打印第1列的值。
或强>
$ awk -v var="1" '$2==var{print $1}' file
image_1324.jpg
image_1784.jpg
您可以通过-v
参数传递要检查的值。
答案 1 :(得分:1)
使用边界\b
:
grep '\b0\b' input
要获取文件名,请使用cut
作为第一列:
grep '\b0\b' input | cut -f1 -d' '
答案 2 :(得分:0)
Avinash Raj's awk
solution可能是手头任务的最佳选择,但如果您确实想使用grep
和< / em>您正在使用 GNU grep
,您可以尝试这样做:
grep -Po '^.+(?= 0$)' in # this looks for '0'
-P
启用对PCRE的支持(与Perl兼容的正则表达式)-o
仅输出每行的匹配部分(?= 0$)
使用前瞻断言来匹配行尾的0
;因为它是断言,所以它不会包含在匹配中,所以只打印文件名。如果您有 BSD grep (例如,在OSX上),-P
因此前瞻断言不可用,请使用choroba's answer在单独的步骤中提取文件名使用cut
。