使用日志文件中的awk(或非awk)提取特定的代码行

时间:2016-11-02 03:54:40

标签: awk sed extract

我正在尝试找到一种从生成的日志文件中提取脚本的方法。

我被困在一个命令调用多个文件的地方,并且脚本用尾随的“\”分隔它们以保证行的连续性。例如,示例脚本是:

my_command -option \
file1 \
file2 \
file3
my_command2 .. ..

看起来很简单,但不知何故,这个伎俩并没有打到我这一点。 请帮忙。 日志中的每一行都以命令的特定标识符开头,如:

:: Script_Command:: my_command -option \
:: file1 \
:: file2 \
:: file3 
:: Info lines....
:: More info lines ...
:: Script_Command:: my_command2 ... ..
:: Info lines ...

所以我用过:

awk '/Script_Command/ {print }'

然后我尝试将它与if条件结合使用:

awk '/Script_Command/ {print substr(length(),1)}'

但整个事情并没有落实到位。 请帮忙。

编辑: 我得到的最接近的是:

awk '{if ($NF=="\\" ||  == "Script_Command::") print ;}' file

它仍然保留file3行,因为它与任何内容都不匹配。

纯粹的意图是: 1.当Script_Command匹配时,打印行。 2.匹配“\”时,打印下一行。 3.两者匹配时,打印行和下一行。

3 个答案:

答案 0 :(得分:1)

您可以使用sed:

sed -n '/Script_Command/ {:a;/\\$/!be;N;ba;:e;p;}'

击穿

                           # -n disables auto printing.
sed -n '/Script_Command/ { # Match regex
  :a                       # Define label 'a'
  /\\$/!be                 # Goto 'e' unless pattern space ends with \
  N                        # Append next line to pattern space
  ba                       # Goto 'a'
  :e                       # Define label 'e'
  p                        # Print pattern space
}'

如果您想要读取以斜杠结尾的行,后跟零个或多个空格,则可以将[[:space:]]*添加到/\\$!be

/\\[[:space:]]*$/!be

答案 1 :(得分:0)

如果每行继续以::开头,可以使用这样的awk:

awk '!/^::/ { p = 0 }           # Set p = 0 if line does not start with ::
      /Script_Command/{ p = 1 } # Set p = 1 when line contains Script_Command
      p'                        # Print if p is truly

答案 2 :(得分:0)

我终于使用以下命令:

 public function getGymByName($query_string)
 {
    $query_string=mysql_real_escape_string($query_string);
    $query=$this->db->query("select * from gym_members_table where member_title like '%$query_string%'");
    return $query->result_array();
 }
</code>