BASH:grep 在 shell 脚本中不起作用,但 echo 显示正确的命令,它可以在命令行上工作



我需要写一个脚本来检查一些>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问题。我在这里缺了什么?

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

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

还要注意引用修复;请参阅何时在shell变量周围加引号;为了避免意外,您应该将私有变量切换到小写(请参阅Correct Bash和shell脚本变量大写(。

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

最新更新