如何使用grep查找shell脚本中行尾的字符串

时间:2018-04-29 08:42:31

标签: bash shell grep

我有一个文件,我在那里搜索位于行尾的数字

  

尝试和信任,由Horatio Alger,Jr。1

     

学校的流浪男孩,Arthur M. Winfield 11

     

海外流浪汉,第1部分,马克吐温23

如果我搜索1,我想打印第一行,其中1位于该行的末尾。不是第二行,其中有11,或第三行,其中1位于句子的中间。

echo "Enter the content you are searching for:"  
    read foo

if x=$(grep -A 1 -i "$foo\$" GUTINDEX.ALL)
    then echo -e "$x"
fi

\ $用于检测线路的末尾,但这不起作用。为什么呢?

3 个答案:

答案 0 :(得分:1)

使用awk:

$ foo=1
$ awk -v s="$foo" '$NF==s' file
Try and Trust, by Horatio Alger, Jr. 1

说明:

$ awk -v s="$foo" '  # the search term in s var
$NF==s               # if the last field is equal to s print the record
' file

答案 1 :(得分:0)

问题是包含11的行也以1结尾。尝试在foo之前添加空格,因此您匹配整个数字:

if x=$(grep -A 1 " ${foo}$" GUTINDEX.ALL)

注意-A 1也会在比赛结束后返回 - 我认为这是你想要的,所以我把它留在了,但如果没有删除它。数字不需要-i,此处不涉及大小写。此外,如果没有任何可被视为变量名称的内容,您也无需转义$ bash会将其视为常规${...}是为了清楚起见。感谢@EdMorton提出的建议。

答案 2 :(得分:0)

如果您尝试创建一个允许您输入正则表达式(正则表达式)作为参数(位置参数)的脚本,则只需使用表单

grep "$2" "$1"

其中"$2"是正则表达式,"$1"是文件名。您还可以根据需要为grep添加任何其他选项(例如匹配后的一行上下文的-A 1等)。

一个简短的例子是:

#!/bin/bash

[ -z "$1" -o -z "$2" ] && {
    printf "error: insufficient input.\n"
    printf "usage: %s filename regex\n" "${0##*/}"
    exit 1
}

[ -r "$1" ] || {
    printf "error: file not readable '%s'\n" "$1"
    exit 2
}

grep "$2" "$1"

注意:没有必要转义'$',因为当它包含在字符串中时它失去了它的特殊含义 - 不执行扩展 - 只要它被引用)

示例使用/输出

$ bash parse.sh gutindex.all '[^0-9]1$'
Try and Trust, by Horatio Alger, Jr. 1

$ bash parse.sh gutindex.all '23$'
A Tramp Abroad, Part 1, by Mark Twain 23

有很多方法可以解决这个问题。仔细看看,如果您有其他问题,请告诉我。