[英]BASH: grep doesn't work in shell script but echo shows correct command and it works on command line
我需要编写一个脚本来检查一些 >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"
然后我得到的 output 是
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 变量周围加上引号; 为避免意外,您应该将私有变量切换为小写(请参阅正确的 Bash 和 shell 脚本变量大写)。
shopt -s expand_aliases
和source ~/.bashrc
只是看起来是多余的,但可能会导致您尝试解决的任何问题; 它们基本上不应该成为您计划在生产中使用的脚本的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.