繁体   English   中英

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

[英]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_aliasessource ~/.bashrc只是看起来是多余的,但可能会导致您尝试解决的任何问题; 它们基本上不应该成为您计划在生产中使用的脚本的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM