您好我有一个清单:
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中包含字符串模式名称的文件,然后用|
查找错误消息和输出答案 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=$0
将list.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)