[英]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.