代码之家  ›  专栏  ›  技术社区  ›  madasionka

Grep固定字和行尾字符

  •  0
  • madasionka  · 技术社区  · 7 年前

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

    给定的单词等于“/1”,我只想打印这行:

    717c41ff4049b0e8cbdc7ec7e49ad021  ./1
    

    我只需要使用grep,在末尾添加“$”锚点,但我的问题是单词可能包含点,所以我需要 -F

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

    3 回复  |  直到 7 年前
        1
  •  2
  •   Sundeep    7 年前

    awk 如果您对单词的定义是指按示例输入中给出的空格分隔

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

    这将只打印最后一个字段完全等于字符串的行 ./1

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


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

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

        2
  •  1
  •   anubhava    7 年前

    grep 使用此模式:

    grep '\./1$' file
    
    d41d8cd98f00b204e9800998ecf8427e  ./1
    

    \./1$ ./1 由于锚固,仅在线路末端 $ .


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

    s='./1'
    
    awk -v s="$s" 'index($0, s) + length(s) -1 == length()' file
    
    d41d8cd98f00b204e9800998ecf8427e  ./1
    

    当搜索词不被空格分隔时,这也会起作用

        3
  •  -1
  •   jq170727    7 年前

    如果要搜索的名称包含 . 你可以逃离他们。例如

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