【问题标题】:BASH: grep doesn't work in shell script but echo shows correct command and it works on command lineBASH:grep 在 shell 脚本中不起作用,但 echo 显示正确的命令并且它在命令行上起作用
【发布时间】:2020-12-22 09:01:06
【问题描述】:

我需要编写一个脚本来检查一些 >20k 文件中的一些 >2k 搜索文本,并且它需要灵活,所以我想出了这个脚本:

#!/bin/bash
# This script checks all files in a given directory against a list of criteria 

shopt -s expand_aliases
source ~/.bashrc

TIMESTAMP=$(date "+%Y-%m-%d-%T")
ROOT_DIR=/data
PROJECT_NAME=$1
FILE_DIR=$ROOT_DIR/projects/$1/$2
RESULT_DIR=$ROOT_DIR/projects/$1/check_result
SEARCHTEXT_FILE=$ROOT_DIR/scripts/$3

OIFS="$IFS"
IFS=$'\n'
files=$(find $FILE_DIR -type f -name '*.json')
for file in $files; do

  while read line; do
         grep -H -o $line "$file" >> $RESULT_DIR/check_result_$TIMESTAMP.log
  done < $SEARCHTEXT_FILE

done
IFS="$OIFS"

此脚本仅生成具有正确名称的空 $RESULT_DIR/check_result_$TIMESTAMP.log 日志文件。
因为文件名有时包含空格,所以我添加了 IFS... 语句并将 $file 括在 " 引号中(从另一篇文章复制)。 $SEARCHTEXT_FILE的内容例如是:

'Tel alt........'
'City ..........'

如果我像这样在 grep 之前放置一个回显

echo grep -H -o $line "$file"

那么我得到的输出是

grep -H -o 'Tel alt........' /data/projects/DNAR/input/report-157538.json

我可以按原样执行这一行并得到正确的结果。

我尝试在此 grep 命令的任何部分周围放置各种 " 或 ' 或 ` 或 () 或 {} 组合,但没有任何改变。 我确实在某处读过有关别名的信息,而为 grep 设置的别名是

alias grep='grep --color=auto'

在互联网上搜索了数小时后,我找不到任何对我有帮助的帖子,因为其中大多数都涉及错误引号或内联 bash 问题。 我在这里缺少什么?

【问题讨论】:

  • 我推测您的输入文件包含 DOS 换行符,但如果没有进一步的诊断就很难判断。另见stackoverflow.com/questions/39527571/…
  • 我在所有文件上都使用了 dos2unix,我还在 vi 中编辑了文件,但没有任何改变。
  • 有一条已删除的评论,我认为它解释了您的循环是如何在错误的事情上运行grep,但我没有足够详细地研究脚本来判断这是否真的解释了缺少输出.我当然也认为您可能在该循环中混淆了您的论点,但是很难判断我们何时看不到文件的内容或它应该操作的目录结构。

标签: linux bash shell grep


【解决方案1】:

简单而明显的解决方法是消除所有这些复杂性,并简单地使用您正在运行的命令的功能。

find "$FILE_DIR" -type f -name '*.json' \
  -exec grep -H -o -f "$SEARCHTEXT_FILE" {} + > "$RESULT_DIR/check_result_$TIMESTAMP.log"

还要注意引用修复;见When to wrap quotes around a shell variable;为避免意外,您应该将私有变量切换为小写(请参阅Correct Bash and shell script variable capitalization)。

shopt -s expand_aliases source ~/.bashrc 只是看起来多余,但可能会导致您尝试解决的任何问题;它们基本上不应该是您计划在生产中使用的脚本的一部分。

【讨论】:

  • 感谢您的回复,我调整了脚本并在上面进行了修改,但仍然没有产生所需的输出。
  • 尝试使用一些示例文件将其缩减为minimal reproducible example。像这样,例如:ideone.com/ONdj9V
  • 我现在还删除了 $SEARCHTEXT_FILE 文件中的 ' 引号,现在它可以工作了。谢谢
  • 啊,本来想问的,忘记了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 2011-05-08
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多