在unix中格式化文本输出

时间:2017-05-31 10:28:15

标签: unix awk sed grep text-processing

您好我有一个清单:

list_1.txt

TypeError

以及具有以下文件名和内容的目录中的文件:

Alpha_123.log

def check_for_errors(result: str) -> bool:

Alpha_123.sh

Alpha

Bravo

Charlie

Bravo.log

Charlie.log

Bravo.log和Charlie.log的内容类似于Alpha.log

我想有这样的输出:

This is a sample line in the file
error_log "This is error1 in file"
This is another sample line in the file
This is another sample line in the file
This is another sample line in the file
error_log "This is error2 in file"
This is another sample line in the file
This is another sample line in the file
error_log "This is error3 in file"
This is another sample line in the file
This is another sample line in the file

非常感谢任何投入。谢谢!

基本上,我想首先找到list_1.txt中包含字符串模式名称的文件,然后用|

查找错误消息和输出

2 个答案:

答案 0 :(得分:0)

如果我理解正确,应该这样做:

 awk -vOFS=\| 'FNR==1{file=FILENAME;sub("[.]log$","",file)}{sub("^error_log ","");print file,$0}' *.log

<强>解释

  • -vOFS=\|输出字段分隔符设置为|。 (\需要|从shell中转义(将其视为管道)。您可以使用-vOFS='|'代替。)
  • FNR==1{ ... }确保每个输入文件只运行一次此代码:FNR是读取的记录(即行数) awk到目前为止的文件。因此,在处理每个文件的第一行时,这仅等于1
  • file=FILENAME只是将当前处理的输入文件的文件名存储在一个变量中,以便以后编辑。
  • sub("[.]log$","",file)删除.log[ ... ]转义点(.)被解释为任何字符在正则表达式中。您可以使用\\.代替。)从文件名的末尾($代表的名称)。
  • { ... }为每个输入文件的每个记录 /行运行代码。
  • sub("^error_log ","")从一开始就删除"error_log "(请注意尾随空格!)(每个行的^代表的含义)(&#34; 记录&#34;)输入。
  • print file,$0打印每个记录的剩余部分(即行),并以相应的文件名为前缀。请注意,逗号(,)将替换为之前指定的输出字段分隔符。您可以使用print file "|" $0而不指定OFS
  • *.log将使当前目录中以.log结尾的每个文件成为awk命令的输入文件。您可以明确指定Alpha.log Bravo.log Charly.log

以下是使用list.txt构建文件名的替代方法:

awk -vOFS=\| '{file=$0;logfile=file ".log";while(getline < logfile){sub("^error_log ","");print file,$0}}' list.txt

<强>解释

  • file=$0list.txt中的当前行(记录)保存在变量中。
  • logfile=file ".log".log附加到其中以获取相应的日志文件名。
  • while(getline < logfile){ ... }将为当前日志文件中的每一行/ 记录运行代码。

其余部分应该从上面的例子中清楚。

答案 1 :(得分:0)

awk救援!

awk '{gsub(/^error_log /,FILENAME"|")}1' $(awk '{print $0".log"}' list_1.txt)

<强>更新

根据更新后的信息,我认为这就是您要找的内容。

awk '/^error_log/ {split(FILENAME,f,"_"); 
                   gsub(/^error_log /,f[1]"|")}' $(awk '{print $0"_*"}' list_1.txt)