我有一个文本文件,文件内容如下:
Dispatcher.Invoke()
我想读取srv id并找到其相应状态,并将其用于进一步验证。
例如: 对于srv id 9500,服务状态为C
我尝试了以下awk语句:
if (logLine.IsRobotLog)
{
System.Windows.Application.Current.Dispatcher.Invoke(() =>
{
LogLineList.Add(logLine);
});
}
它给了我空白的输出。
这里testfile是我的示例文本文件。
任何输入表示赞赏。
答案 0 :(得分:3)
awk -F '[][]' '$1 ~ /srv id/ {id = $2} $1 ~ /serv status/ {print id, $2}' file
使用[
或 ]
作为字段分隔符。如果第一个字段包含“ srv id”,请记住该id。如果第一个字段包含“服务状态”,请打印ID和状态值。
输出:
8503 C
8501 C
8500 C
答案 1 :(得分:0)
考虑到您的Input_file与所示示例相同,请尝试以下操作。
awk '
/SERVICE INFO/ && srv && status{
print srv " status is:" status
srv=status=""
}
/srv id/{
gsub(/\]|\[/,"",$NF)
srv=$NF
next
}
/serv status/{
gsub(/\]|\[/,"",$NF)
status=$NF
}
END{
if(srv && status){
print srv " status is:" status
}
}' Input_file
输出如下。
8503 status is:C
8501 status is:C
8500 status is:C
答案 2 :(得分:0)
如果您不介意Perl:
perl -00 -ne 'm{srv id.+?(\d+).+status.+\[(\w)\]}s and print "$1 $2\n"' file
这将产生:
8503 C
8501 C
8500 C
-00
开关告诉Perl以“段模式”读取文件,其中记录分隔符是一个或多个空行。
我们匹配一个以“ srv id”开头并以标记“ status”和其值结尾的字符序列。点是任何字符; +
表示一个或多个; +?
表示非贪婪匹配。 \d
代表数字,\w
代表文字字符。方括号的开头和结尾必须转义以表示自己。为了使点与换行符匹配,我们在匹配模式s
的末尾添加m{...}s
修饰符
是否要查找ID来打印其状态,只需grep
作为输出中的ID,然后通过管道传送到grep
:
perl ... | grep 8501