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

Match number 1 and not 10 or 11 using grep or other way

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

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

的行

你可以使用 awk。

$ awk '=="1"{print }' file
image_1324.jpg
image_1784.jpg

仅当第 2 列的值恰好为 1.

时,才会打印第 1 列的值

$ awk -v var="1" '==var{print }' file
image_1324.jpg
image_1784.jpg

您可以通过 -v 参数传递要检查的值。

使用单词边界\b:

grep '\b0\b' input

要仅获取文件名,请对第一列使用 cut

grep '\b0\b' input | cut -f1 -d' '

可能是手头任务的更好选择,但是 如果您确实想使用 grep and 你正在使用 GNU grep,你可以试试这个:

grep -Po '^.+(?= 0$)' in  # this looks for '0'
  • -P 打开对 PCRE(Perl 兼容的正则表达式)的支持
  • -o只输出每行匹配的部分
  • (?= 0$) 使用先行断言来匹配行尾的 0;因为它是一个断言,它不会包含在匹配中,所以只打印文件名。

如果您有 BSD grep(例如,在 OSX 上),其中 -P 因此前瞻断言不可用,请使用 使用 cut.

在单独的步骤中提取文件名