根据Bash Linux中的每一行文件读取并运行不同的命令?

时间:2016-03-23 10:45:16

标签: linux bash

我是bash脚本的新手。我正在尝试编写一个脚本,以便逐行读取<div id="divToHide"> </div> <br /> <p> This is a paragraph. If you hover <span id="hoverMe" onmouseover="hideDiv()" onmouseout="showDiv()">here</span>, it will hide the red box. </p>,其中包含以下内容:

recent_log.txt

然后为每一行运行以下命令取决于后缀。输出应该在另一个文件中。每个输出之间应该有2行间距。

admin@bi01:/var/cache/logs$ head  recent_log.txt
./calisto/tomcat6-energy/calls.log.2016-03-05
./calisto/tomcat6-energy/calls_flush.log.2016-03-05.gz
./calisto/tomcat6-energy/catalina.2016-03-05.log.gz
./calisto/tomcat6-energy/energy-receive.log.2016-03-05.gz
./calisto/tomcat6-energy/energy.log.2016-01-01.gz
./calisto/tomcat6-energy/energy.log.2016-01-02.gz
./calisto/tomcat6-energy/energy.log.2016-01-03.gz
./calisto/tomcat6-energy/energy.log.2016-01-04.gz
./calisto/tomcat6-energy/energy.log.2016-01-05.gz
./calisto/tomcat6-energy/energy.log.2016-01-06.txt

到目前为止,这是我的解决方案,我不确定应该如何完成它:

zcat users_energy.log.2016-03-20.gz | head -n5

请您帮助我如何区分cat或zcat,..以及如何完成我的代码?

2 个答案:

答案 0 :(得分:3)

我认为你正在寻找类似的东西:

raw_log_dir=/var/cache/logs/recent_log.txt
output_dir=/var/cache/logs/output
i=0

while read -r line; do
    (( i > 0 )) && printf '\n\n'
    i=$(( i + 1 ))

    if [[ $line = *.gz ]]; then
        zcat "$line" | head -n5
    else
        head -n5 "$line"
    fi
done < "$raw_log_dir" > "$output_dir"

$raw_log_dir中读取文件的每一行(始终引用变量,读取行while read,而不是for)。如果该行以.gz结尾,则使用zcat,否则直接使用head。将循环的输出重定向到另一个文件。请注意我使用小写变量名称,这被认为是一种好习惯,因为大写变量名称可能与shell使用的名称冲突。

循环的前两行在第一行之后的每一行的输出之前添加两个空行。在某些shell上,您可以使用(( i++ > 0 )) && printf '\n\n'更简洁地执行此操作,但++不是标准功能,因此这种方式更便于移植。

要在尝试阅读文件之前检查文件是否存在,您可以在循环顶部添加这样的行:

[[ -f $line ]] || continue

答案 1 :(得分:0)

这是你的意思吗?

RAW_LOG_DIR=/var/cache/logs/recent_log.txt
OUTPUT_DIR=/var/cache/logs/output
FILES=`cat $RAW_LOG_DIR | xargs -r`

for LOG in $FILES; do
    zcat -f $LOG | head -n5 > $OUTPUT_DIR
done