grep固定字和行尾字符

Grep fixed word and end of line character

我正在编写 bash 脚本,我想打印所有包含单词的行,但前提是它位于行尾。所以给出这样的文件:

d41d8cd98f00b204e9800998ecf8427e  ./12/2.txt
d41d8cd98f00b204e9800998ecf8427e  ./12/1
d41d8cd98f00b204e9800998ecf8427e  ./12/1.txt
d41d8cd98f00b204e9800998ecf8427e  ./1
d41d8cd98f00b204e9800998ecf8427e  ./11.txt

并且给定的单词等于“./1”我只想打印行:

717c41ff4049b0e8cbdc7ec7e49ad021  ./1

我会简单地使用 grep,在末尾添加“$”锚点,但我的问题是这些词可能包含点,所以我需要有 -F 选项,但后来我我不确定如何确保打印的行在行尾包含单词,因为我不能使用行锚点。

编辑: 该词作为变量而不是固定字符串传递。

您可以将 grep 与此模式一起使用:

grep '\./1$' file

d41d8cd98f00b204e9800998ecf8427e  ./1
由于锚 $.

\./1$ 将仅在行尾匹配 ./1


根据下面的评论,如果您想使用变量传递搜索词:

s='./1'

awk -v s="$s" 'index([=11=], s) + length(s) -1 == length()' file

d41d8cd98f00b204e9800998ecf8427e  ./1

这在搜索词未被空格分隔时也有效

如果您要搜索的名称包含.,您可以将它们转义。例如

bash-3.2$ NAME="./1"
bash-3.2$ grep "$(sed -e 's/[.]/[.]/g' <<< "$NAME")$" file
d41d8cd98f00b204e9800998ecf8427e  ./1

如果您对单词的定义表示白色-space,您也可以使用 awk,如示例输入中给出的那样分隔

$ awk '$NF == "./1"' ip.txt 
d41d8cd98f00b204e9800998ecf8427e  ./1

这将只打印最后一个字段正好等于字符串 ./1

的那些行

如果搜索词发生变化,无需担心转义正则表达式元字符


要传递 shell 变量:

$ s='./1'
$ awk -v word="$s" '$NF == word' ip.txt 
d41d8cd98f00b204e9800998ecf8427e  ./1

另见 How do I use shell variables in an awk script?