使用Shell脚本在文本文件中找到特定字符串后如何获取值

时间:2018-10-02 18:38:26

标签: bash shell unix awk

我有一个文本文件,文件内容如下:

Dispatcher.Invoke()

我想读取srv id并找到其相应状态,并将其用于进一步验证。

例如: 对于srv id 9500,服务状态为C

我尝试了以下awk语句:

if (logLine.IsRobotLog)
{
    System.Windows.Application.Current.Dispatcher.Invoke(() =>
    {
        LogLineList.Add(logLine);
    });                                
}

它给了我空白的输出。

这里testfile是我的示例文本文件。

任何输入表示赞赏。

3 个答案:

答案 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