我的目标是阅读revisions.txt
中的每个修订版本,并从logs.txt
文件中提取该版本号的文本。
例如revisions.txt
文件具有以下输入,
logs.txt
文件具有以下输入,
我希望获得revisions.txt
文件中所有修订版的所有内容。我提出了以下代码,
#!/bin/bash
echo "Start!"
input=logs.txt
revision=revisions.txt
IFS=$'\n' read -d '' -r -a revs < $revision
for rev in "${revs[@]}"
do
echo $rev
while IFS='' read -r line || [[ -n "$line" ]]; do
regex='^'$rev'(.*)'
if [[ $line =~ $regex ]];
then
echo $line
fi
done < "$input"
done
输出截至目前, APP-1001 APP-1002 APP-1004 APP-1004:XYZ问题的错误修复
它只是打印最后一个版本的文本,即APP-1004。我在网上看到,它无法在嵌套循环中读取两个文件。
请建议采用不同的方法。
提前致谢。
答案 0 :(得分:0)
您可以嵌套循环,因此,您可以同时从两个文件进行迭代。
while read revisions_line
do
while read logs_line
do
echo "This line comes from revisions : $revisions_line"
echo "This line comes from logs : $logs_line"
done << "$( cat logs.txt)"
done << "$( cat revisions.txt)"
问候!
答案 1 :(得分:0)
您可以简单地使用以下脚本: -
#!/bin/bash
while read line
do
#echo "$line logs.txt"
log_info=$(grep $line logs.txt)
if [ log_info != "" ]; then
echo "$log_info" | awk '{$1=$2=""; print $0}' | sed 's/^[ \t]*//'
fi
done < revisions.txt
它将如何运作? while循环将读取文件revisions.txt
中的每一行,而grep
将在logs.txt
文件中搜索该行,如果找到,则会将该行存储在变量log_info
中。现在,如果log_info
变量不为空,则该行将重定向到awk
命令,awk
命令将从行中删除column1和column2,并将输出重定向到sed
命令,最后sed
将从中删除前导空格。最终的出局将是: -
Bug Fix for XYZ issues
Bug Fix for XYZ issues
Bug Fix for XYZ issues
如果你想整个字符串只需修改如下: -
echo "$log_info"
如果您不关心前导空格,可以在下面继续: -
echo "$log_info" | awk '{$1=$2=""; print $0}'