使用grep或其他方式匹配1号而不是10或11

时间:2015-03-16 14:13:17

标签: regex bash awk grep

我有一个包含以下内容的文件:

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行

3 个答案:

答案 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