【问题标题】:grep filename only in linux bashgrep 文件名仅在 linux bash 中
【发布时间】:2021-06-02 14:06:14
【问题描述】:

我想找一个文件。如果用户输入“file.txt”,那么我需要回显“file.txt”。但如果找不到文件名,则回显“未找到”。我拥有的代码用于在文件中查找单词。但是如果我只需要搜索文件怎么办。如果我写:result=`grep $filename`,它将无法正常工作。 grep 文件名的格式是什么?

 #!/bin/bash
    echo -n "File name : "
    read filename
    echo -n "Word : "
    read word
    result=`grep $word $filename`
    if [ "$result" != "" ]
    then
          echo "$result"
    else
          echo "Not found"
    fi

【问题讨论】:

  • 我不明白 - 你想检查给定的文件是否存在?
  • 为什么需要使用grep?使用 if [ -f "$filename" ]; then echo "$filename"; else echo "not found"; fi 会做你想做的事。
  • 是的,没错@BenjaminW。
  • 你想用多少种不同的方式来做呢?是的,您可以使用grep;不,这样做没有任何意义,任何此类使用grep 几乎都是毫无意义的(更不用说比理智的方式更难)。我想你可以在ls "$filename" 2>/dev/null | grep "$filename" || echo "not found" 上尝试一些变体。但是,如果您的文件名可能包含换行符、空格或其他非推荐字符,则使用 ls 的输出可能会出错。
  • POSIX 指定 grep 在错误时返回退出代码 >1

标签: linux bash grep


【解决方案1】:

您似乎正在尝试确定$word 是否存在于$filename 中。如果是这样:

if ! grep "$word" "$filename"; then
   echo not found >&2
fi

确定文件是否存在的检查似乎是多余的,因为如果文件不存在,grep 会发出错误消息,但也许你想要类似的东西:

if test -e "$filename" && ! grep "$word" "$filename"; then
    echo "$word" is not found in "$filename" >&2
else
    echo "$filename" does not exist >&2
fi

除了来自grep 的错误消息说文件不存在之外,它不会打印多余的“未找到”。

【讨论】:

  • 将输出$word 而不是$filename
【解决方案2】:

用grep,你可以这样试试:

#!/bin/bash
OLDIFS="$IFS"
IFS=''
read -p "File name : " filename
IFS=$OLDIFS
grep -l '' "$filename" 2>/dev/null
! [ $? -eq 0 ] && echo "file $filename not found"

bemol : grep 找不到大小为 0 的文件。

【讨论】:

  • 如果您只想为read设置IFS,只需将其放在同一行,不带;或其他命令分隔符:IFS= read -r -p "File name : " filename,然后更改范围为read 所以你以后不需要改回来。
  • 另外,以这种方式使用$? 通常是一种反模式。我不知道您为什么要这样做,而不是 grep -q -l "" "$filename" &>/dev/null || echo "file $filename not found" >&2。见Why is testing $? to see if a command succeeded or not an antipattern?
  • @CharlesDuffy。感谢 cmets。如果文件存在,OP 想要打印文件名,如果文件不存在则找不到,因此不需要 -q 选项。我必须在更新答案之前研究您的评论,因为我不明白 &>/dev/null。
  • &>/dev/null>/dev/null 2>&1 的简写。鉴于上面的说明,它是不需要的。也就是说,我相信关于$? 的说明仍然适用。
【解决方案3】:

如果我没看错的话……

grep -l "$word" "$filename" 2>&- || echo "not found"

如果$word 存在于$filename 中,-l 选项将输出文件名。
如果不是,grep 将返回错误退出代码,||(“或”)将执行 echo

$: echo foo > bar
$: grep -l foo ??? 
bar
$: rm bar
$: grep -l foo ??? 2>&- || echo "not found"
not found

2>&- 关闭 STDERR,以便grep 不会抛出自己的错误消息。
没有它-

$: grep -l foo ??? || echo "not found"
grep: ???: No such file or directory
not found

当然https://mywiki.wooledge.org/BashPitfalls#myprogram_2.3E.26- 建议不要关闭标准流,所以你应该使用2>/dev/null

所以,整个脚本:

#!/bin/bash
read -p "Filename: " filename
read -p "Word: "     word
grep -l "$word" "$filename" 2>/dev/null || echo "not found"

【讨论】:

    猜你喜欢
    • 2011-10-02
    • 2016-12-18
    • 1970-01-01
    • 2016-08-01
    • 2018-08-04
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多