【发布时间】:2020-12-22 09:01:06
【问题描述】:
我需要编写一个脚本来检查一些 >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 问题。 我在这里缺少什么?
【问题讨论】:
-
我推测您的输入文件包含 DOS 换行符,但如果没有进一步的诊断就很难判断。另见stackoverflow.com/questions/39527571/…
-
我在所有文件上都使用了 dos2unix,我还在 vi 中编辑了文件,但没有任何改变。
-
有一条已删除的评论,我认为它解释了您的循环是如何在错误的事情上运行
grep,但我没有足够详细地研究脚本来判断这是否真的解释了缺少输出.我当然也认为您可能在该循环中混淆了您的论点,但是很难判断我们何时看不到文件的内容或它应该操作的目录结构。