簡體   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