【问题标题】:Format grep Output in Columns在列中格式化 grep 输出
【发布时间】:2016-08-25 23:25:37
【问题描述】:

我有一个很大的日志文件,我需要从中提取一些特定的数据,更准确地说,是重复出现的不同字段的值,即我需要从许多 CDR 中获取一些信息,例如呼叫类型,始发编号等

原文格式如下:

Reason Code:"XXX",  Result Code:XXX, Desc: "XXX"
..
A_NUMBER.ADDRESS = XXX
..

使用 egrep 我设法获得了所需的行,看起来像:

 Reason Code:"XXX",  Result Code:XXX, Desc: "XXX"
 RECORD_IDENTIFICATION.FILE_ID: XXX
 A_NUMBER.ADDRESS = XXX
 Call is from XXXX, VDATE=XXXX.

但我无法将它们格式化为表格样式,按 Reason、File_ID、A_Num 和 Call Date 分组,充当列标题, 喜欢

Reason Code | File_ID | A_Number | Date 
  xxxx | xxxx | xxxx | xxxx | 

我对外观不是很感兴趣,我只是希望元素是连续的,以便属于同一个调用。

我弄乱了 awk、sed 和 printf 的不同变体,但似乎没有任何效果。

我试图将总字符值作为参数放在 printf 中

printf "%-205s\n" $(grep -E 'Reason Code|RECORD_IDENTIFICATION.FILE_ID|A_NUMBER.ADDRESS|Call is from' file.err)

printf "%-65s | %-65s |  %-65s | %-65s" $(grep -E 'Reason Code|RECORD_IDENTIFICATION.FILE_ID|A_NUMBER.ADDRESS' file.err | awk 'FS = "\n" {print $1}')

但输出中的值是乱码且无法使用。

在我看来,解决方案可能存在于某种 awk 似乎支持的循环中,但我无法解决。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • Edit 您的问题向我们展示您的示例输入和相应所需输出的最小示例。如果您尝试过,请也向我们展示。

标签: bash awk sed grep printf


【解决方案1】:

您可以使用sed 转换grep 命令的输出:

sed 'N;N;N;s/Reason Code:"\([^"]*\).*FILE_ID: \([^\n]*\).*A_NUMBER.ADDRESS = \([^\n]*\).*VDATE=\([^.]*\).*/\1 \2 \3 \4/'

 

$ echo ''' Reason Code:"XXX",  Result Code:XXX, Desc: "XXX"
 RECORD_IDENTIFICATION.FILE_ID: XXX
 A_NUMBER.ADDRESS = XXX
 Call is from XXXX, VDATE=XXXX.''' | sed 'N;N;N;s/Reason Code:"\([^"]*\).*FILE_ID: \([^\n]*\).*A_NUMBER.ADDRESS = \([^\n]*\).*VDATE=\([^.]*\).*/\1 \2 \3 \4/'
 XXX XXX XXX XXXX

但是,最好避免使用grep 并让sed 也进行过滤。我无法提出这样的解决方案,因为您没有发布未过滤数据的格式。

【讨论】:

  • 感谢您的解决方案。它做了我正在寻找的东西,甚至更多,因为它只给出了值,没有额外的文本。但是,我面临一个我无法解决的问题。第 1 行和第 2 行的输出是对齐的,同时第 3 行和第 4 行的结果都在下面的新行中。您知道为什么会发生这种情况吗?
  • 是的,对 :) 这是我使用的代码的最后一个版本,因为我稍微修改了它以包含“呼叫来自”的相应值:codesed 'N; N;N;s/原因代码:"([^"]*).*RECORD_IDENTIFICATION.FILE_ID: ([^\n]*).*A_NUMBER.ADDRESS = ([^\n]*).*呼叫来自([^,]*).*/\1 \2 \3 \4/'
  • 这对我来说看起来不错,不应该有任何与分组模式匹配的换行符...您能否用ideone sn-p 中的一些示例数据重现问题?跨度>
  • 当我通过 echo 添加单个块时,输出很好(请检查:ideone.com/OyM4Oi)同时当我将输出发送到 .txt 文件时,出现我描述的问题
  • 不是输出重定向,this snippet 也将结果重定向到一个文件并且文件内容不包含换行符。它可能是额外的字符(\r 将被分组然后显示为换行符?)或环境相关。
猜你喜欢
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2018-07-19
相关资源
最近更新 更多