我是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,..以及如何完成我的代码?
答案 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