我正在编写一个bash脚本,我想打印包含单词的所有行,但前提是它只是在一行的末尾。所以给出这样一个文件:
d41d8cd98f00b204e9800998ecf8427e ./12/2.txt
d41d8cd98f00b204e9800998ecf8427e ./12/1
d41d8cd98f00b204e9800998ecf8427e ./12/1.txt
d41d8cd98f00b204e9800998ecf8427e ./1
d41d8cd98f00b204e9800998ecf8427e ./11.txt
并且给定的单词等于" ./ 1"我想只打印一行:
717c41ff4049b0e8cbdc7ec7e49ad021 ./1
我只是使用grep," $"锚添加到最后,为此但我的问题是,这些单词可能包含点,所以我需要-F
选项,但后来我不确定如何确保打印行包含在最后的单词这条线,因为我不能使用线锚。
编辑: 该单词作为变量传递而不是固定字符串。
答案 0 :(得分:2)
如果你的单词定义意味着像样本输入中给出的白色空格一样,你也可以使用awk
$ awk '$NF == "./1"' ip.txt
d41d8cd98f00b204e9800998ecf8427e ./1
这将只打印那些最后一个字段完全等于字符串./1
如果搜索词更改
,则无需担心转义正则表达式元字符
传递shell变量:
$ s='./1'
$ awk -v word="$s" '$NF == word' ip.txt
d41d8cd98f00b204e9800998ecf8427e ./1
答案 1 :(得分:1)
您可以对此模式使用grep
:
grep '\./1$' file
d41d8cd98f00b204e9800998ecf8427e ./1
由于锚\./1$
, ./1
仅会在行尾与$
匹配。
根据以下评论,如果您想使用变量传递搜索词:
s='./1'
awk -v s="$s" 'index($0, s) + length(s) -1 == length()' file
d41d8cd98f00b204e9800998ecf8427e ./1
当搜索字词没有用空格分隔
时,这也会有效答案 2 :(得分:-1)
如果您要搜索的名称包含.
,则可以将其转义。 e.g
bash-3.2$ NAME="./1"
bash-3.2$ grep "$(sed -e 's/[.]/[.]/g' <<< "$NAME")$" file
d41d8cd98f00b204e9800998ecf8427e ./1