我正在编写一个shell脚本并卡在一个地方。我有一个输入文件,其中我有两列第一列有一个日志文件名,第二列有第一次出现语法的行号。例如如下。
文件名:checkit.txt
内容
hellohowru.log 12345
helpmehere.log 45677
checkitout.log 67543
我想在txt文件checkit.txt中的每个日志文件中grep查找特定语法或单词,从相应行的行号开始。
如何为所有日志文件循环。
例如:tail -n +12345 hellohowru.log| grep -il 'exception'
如果发现异常,我可以拥有文件名。
请帮忙
答案 0 :(得分:1)
您可以在while read
循环中执行此操作:
while read -r file num; do
tail -n +$num "$file" | grep -qi 'exception' && echo "$file"
done < checkit.txt > output.txt
答案 1 :(得分:1)
awk '
NR==FNR { ARGV[ARGC]=$1; ARGC++; start[$1]=$2; next }
(FNR > start[FILENAME]) && (tolower($0) ~ /exception/) { print FILENAME; nextfile }
' checkit.txt
上面使用nextfile
的GNU awk和任意数量的打开文件的处理 - 如果你没有gawk然后在任何awk中它是:
awk '
NR==FNR { ARGV[ARGC]=$1; ARGC++; start[$1]=$2; next }
FNR==1 { close(prev); prev=FILENAME }
(FNR > start[FILENAME]) && (tolower($0) ~ /exception/) && !seen[FILENAME]++ { print FILENAME }
' checkit.txt
答案 2 :(得分:0)
另一个简单的解决方案
ALGO:
- 逐行阅读文件
- 获取文件名和亚麻布
- 执行“异常”的tail + grep命令
- 如果找到匹配项,则打印文件名
cat checkit.txt | while read line
do
LOGFILE=$(echo $line | awk -F ' ' '{print $1}')
LINECNT=$(echo $line | awk -F ' ' '{print $2}')
#echo "HI : $LOGFILE and $LINECNT"
tail -n +$LINECNT $LOGFILE | grep -i "exception" 1> /dev/null
if [ $? -eq 0 ]
then
echo "EXCEPTION IN $LOGFILE"
fi
done