,假设我们在目录中的prod unix Machine(SUNOS)上有多个.log文件:例如:
ls -tlr
total 0
-rw-r--r-- 1 21922 21922 0 Sep 10 13:15 file2017-01.log
-rw-r--r-- 1 21922 21922 0 Sep 10 13:15 file2016-02.log
-rw-r--r-- 1 21922 21922 0 Sep 10 13:15 todo2015-01.log
-rw-r--r-- 1 21922 21922 0 Sep 10 13:15 fix20150223.log
此处的目的是,通过NAWK i从日志中提取特定信息(分析日志),然后将它们"转换"到.csv文件,以便之后将它们加载到Oracle表中。尽管NAWK已经进行了测试并像魅力一样工作,但我如何自动化一个执行以下操作的bash脚本:
1)对于此路径中的给定文件列表
2)NAWK(从日志文件中提取特定数据/信息)
3)输出分别将每个文件分别为唯一的.csv 到另一个目录
4)从此路径中删除.log文件
我与我有关的是,每个文件结束的LoadStamp/Timestamp不同。我已经实施了一个仅适用于最新日期的脚本。(例如上个月)。但是我想加载所有历史数据,然后我被卡住了。
可视化,我所需的/目标输出是:
bash-4.4$ ls -tlr
total 0
-rw-r--r-- 1 21922 21922 0 Sep 10 13:15 file2017-01.csv
-rw-r--r-- 1 21922 21922 0 Sep 10 13:15 file2016-02.csv
-rw-r--r-- 1 21922 21922 0 Sep 10 13:15 todo2015-01.csv
-rw-r--r-- 1 21922 21922 0 Sep 10 13:15 fix20150223.csv
请如何实现此BASH脚本?如前所述,加载只需一段时间,这是历史性的。任何帮助都可能非常有用。
为可读性而不是柔软而写的实现可能看起来像:
#!/usr/bin/env bash
for infile in *.log; do
outfile=${infile%.log}.csv
if awk -f yourscript <"$infile" >"$outfile"; then
rm -f -- "$infile"
else
echo "Processing of $infile failed" >&2
rm -f -- "$outfile"
fi
done
了解其工作原理,请参阅:
- globbing-用该扩展名的文件列表替换
*.log
的机制。 - 经典的
for
循环 -for infile in
语法,用于迭代上面的地球结果。 - 参数扩展-
${infile%.log}
语法,用于扩展infile
变量的内容,并用任何.log
修剪。 - 重定向 -
<"$infile"
和>"$outfile"
中使用的语法,打开命名文件附加的stdin和stdout;或>&2
,将日志重定向到stderr。(因此,当我们运行awk
时,其stdin已连接到.log
文件,其Stdout已连接到.csv
文件)。