Grep固定字和行尾字符

时间:2017-09-11 07:59:22

标签: regex bash grep eof

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

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

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

717c41ff4049b0e8cbdc7ec7e49ad021  ./1

我只是使用grep," $"锚添加到最后,为此但我的问题是,这些单词可能包含点,所以我需要-F选项,但后来我不确定如何确保打印行包含在最后的单词这条线,因为我不能使用线锚。

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

3 个答案:

答案 0 :(得分:2)

如果你的单词定义意味着像样本输入中给出的白色空格一样,你也可以使用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?

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