Awk 使用bash从自定义(文本)日志文件结尾提取特定文本

Awk 使用bash从自定义(文本)日志文件结尾提取特定文本,awk,Awk,我只想要最近的五个数字(这是文件底部的一个数字,可能有数百个这样的组) 如何从该文件中提取数字?我尝试过使用sed的各种方法,但特别是仅获取最后五个值让我感到困惑 我想要的输出是: echo "<added>3</added>"; echo "<modified>0</modified>"; echo "<deleted>2</modified>"; echo "<excluded>1</excluded&

我只想要最近的五个数字(这是文件底部的一个数字,可能有数百个这样的组)

如何从该文件中提取数字?我尝试过使用sed的各种方法,但特别是仅获取最后五个值让我感到困惑

我想要的输出是:

echo "<added>3</added>";
echo "<modified>0</modified>";
echo "<deleted>2</modified>";
echo "<excluded>1</excluded>";
echo "<total>6.18</total>";
我希望这证明是有用的。

对于bash和regex:

tail -n 5 file | while read -r line; do [[ $line =~ (.*):\ (.*) ]]; echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}"; done
输出:

Added 3 Modified 0 Deleted 2 Excluded 1 Total Time 6.18
echo "<added>3</added>"
echo "<modified>0</modified>"
echo "<deleted>2</deleted>"
echo "<excluded>1</excluded>"
echo "<total>6.18</total>"
增加3 修改0 删除2 排除1 总时间6.18 更新:

tail -n 5 file | while read -r line; do [[ $line =~ ([^\ ]*).*:\ (.*) ]]; echo "echo \"<${BASH_REMATCH[1],,}>${BASH_REMATCH[2]}</${BASH_REMATCH[1],,}>\""; done
tail-n5文件|读取-r行时;do[[$line=~([^\]*).:\(.*);echo“echo\”${BASH_重赛[2]}\”;完成
输出:

Added 3 Modified 0 Deleted 2 Excluded 1 Total Time 6.18
echo "<added>3</added>"
echo "<modified>0</modified>"
echo "<deleted>2</deleted>"
echo "<excluded>1</excluded>"
echo "<total>6.18</total>"
echo“3”
回显“0”
回声“2”
回声“1”
回声“6.18”
$awk-F'[:]+''
NF{tags[++numTags]=tolower($1);vals[numTags]=NF;next}
{numTags=0}
结束{

对于(tagNr=1;tagNr回答你的最后一个问题。通常情况下,如果你不展示你是如何试图解决这个问题的,会有一票否决票。你至少要展示你自己为解决这个问题所做的研究。我已经提到我曾试过使用sed,我真的必须展示我尝试过的所有行不通的行吗?这是迂腐的极端不?即使是SO@Cyrus-编辑以显示我不是一个浪费时间的人,尽管我有合理的代表。
事实上,我在业余时间在这里为其他人提供了超过200个答案
使你与其他寻求帮助的人没有什么不同,因此这不会成为你发布一个好问题的借口,包括输入、输出和代码和密码这并不意味着任何阅读你的问题的人都能将其与要求我们为他们做家庭作业的人区分开来,因此没有代码,谁愿意毫不费力地为你编写代码。@Cyrus只是就如何获得答案给了你很好的建议,而不是迂腐或“像一个小学生”那样测试你@Ed Morton我尊重你的意见,但我不同意。我和你在这里的声誉就是——字面上的声誉。为什么声誉在社会上的其他地方都很重要,除了这一点?我们都知道“迄今为止展示你的工作”规则所涉及的“各种问题”,我的问题是不可能的,我在其中已经提到了“sed”基于sed的方法需要包括一些不起作用的sed行。我知道这是错误的方法,我正在寻求帮助……谢天谢地,我确实收到了帮助。非常感谢,我会看看我是否能适应它,因为(学究式地)这不是我要求的输出。我感谢你的帮助,但到目前为止我还没有达到我想要的输出,我很抱歉尝试以下内容:
echo“echo\”${BASH_REMATCH[2]}”
我刚才注意到最后一行不太正确。非常感谢您的输入,我不会说谎,我一个字也听不懂!我不会要求费力的解释,除非您认为其他人会从中受益,但如果您认为这样更好、更差或“大致相同”,我将不胜感激正如上面的答案。这仅仅是出于兴趣的不同方法吗?使用awk通常是更好的方法,因为它更有效(请参阅)但是在这个特殊的例子中,这并不重要,因为你在循环中只读取了5行代码,而且它的可移植性更高,因为它可以在每个UNIX机器上的任何shell中处理任何awk,而不仅仅是bash。还有其他一些小的区别——主要是这是正确的通用方法,但是尾部while循环可能适合你的指定例如。
$ awk -F'[: ]+' '
    NF { tags[++numTags]=tolower($1); vals[numTags]=$NF; next }
    { numTags=0 }
    END {
        for (tagNr=1; tagNr<=numTags; tagNr++) {
            printf "echo \"<%s>%s</%s>\";\n", tags[tagNr], vals[tagNr], tags[tagNr]
        }
    }
' file
echo "<added>3</added>";
echo "<modified>0</modified>";
echo "<deleted>2</deleted>";
echo "<excluded>1</excluded>";
echo "<total>6.18</total>";