如何迭代.log文件,通过尴尬处理它们,然后用不同的扩展名代替输出文件



,假设我们在目录中的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文件)。

相关内容

  • 没有找到相关文章

最新更新