【问题标题】:Grep multiple strings and then replace textgrep 多个字符串,然后替换文本
【发布时间】:2017-03-20 14:49:48
【问题描述】:

我有以下清漆命令:

sudo varnishlog -c

及其输出

*   << Request  >> 658516
-   Begin          req 658515 rxreq 
-   ReqMethod      GET
-   ReqURL         /sample/2 
-   VCL_call       HIT
-   RespHeader     X-Timestamp: 1460482977.61998
-   RespHeader     X-Varnish: 658516 658416
-   RespHeader     X-Varnish-Cache: HIT

从此命令输出中,我想将输出重定向到具有以下格式的文件:

Begin="req 658515 rxreq",ReqURL="/sample/2", RespHeader="X-Varnish-Cache: HIT"

我已使用 grep 命令获取必填字段:

sudo varnishlog -c | grep -E 'Begin|ReqURL|Varnish-Cache'

-   Begin          req 658515 rxreq 
-   ReqURL         /sample/2
-   RespHeader     X-Varnish-Cache: HIT

但如果我使用其他命令来替换空格和换行符,我将面临问题。

sudo varnishlog -c | grep -E 'Begin|ReqURL|Varnish-Cache' | sed 's/ /=/g'

使用这个命令我没有得到任何输出。

如果我使用 sed 或 tr 命令:

sudo varnishlog -c | sed 's/ /=/g'

sudo varnishlog -c | tr ' ' '='

然后输出是:

*===<<=Request==>>=629459====
-===Begin==========req=629458=rxreq
-===ReqMethod======GET
-===ReqURL=========/sample/2
-===VCL_call=======HIT
-===RespHeader=====X-Varnish-Cache:=HIT

如果我使用这个:

sudo varnishlog -c | sed 's/\t/=/g'

然后输出和原来的一样:

*   << Request  >> 658516
-   Begin          req 658515 rxreq 
-   ReqMethod      GET
-   ReqURL         /sample/2 
-   VCL_call       HIT
-   RespHeader     X-Timestamp: 1460482977.61998
-   RespHeader     X-Varnish: 658516 658416
-   RespHeader     X-Varnish-Cache: HIT

请帮助我提供一些关于获得所需输出的正确方法的提示。

@Sundeep, 我机器上的 Perl 版本是:

 perl -version

This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi
(with 44 registered patches, see perl -V for more detail)

@Sundeep,

sudo varnishlog -c | cat -A的输出

$
*   << Request  >> 363192    $
-   Begin          req 363191 rxreq$
-   Timestamp      Start: 1478514424.525802 0.000000 0.000000$
-   Timestamp      Req: 1478514424.525802 0.000000 0.000000$
-   ReqStart       10.56.36.2 52583$
-   ReqMethod      GET$
-   ReqURL         /sample/2$
-   ReqProtocol    HTTP/1.1$
-   ReqHeader      Host: localhost:6081$
-   ReqHeader      User-Agent: Mozilla/5.0 (X11; Ubuntu;....$
-   ReqHeader      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8$
-   ReqHeader      Accept-Language: en-US,en;q=0.5$
-   ReqHeader      Accept-Encoding: gzip, deflate$
-   ReqHeader      Connection: keep-alive$
-   ReqHeader      Pragma: no-cache$
-   ReqHeader      Cache-Control: no-cache$
-   ReqHeader      X-Forwarded-For: 10.56.36.2$
-   VCL_call       RECV$
-   VCL_return     hash$
-   ReqUnset       Accept-Encoding: gzip, deflate$
-   ReqHeader      Accept-Encoding: gzip$
-   VCL_call       HASH$
-   VCL_return     lookup$
-   Hit            658416$
-   VCL_call       HIT$
-   VCL_return     deliver$
-   RespProtocol   HTTP/1.1$
-   RespStatus     200$
-   RespReason     OK$
-   RespHeader     Content-Length: 4774$
-   RespHeader     Last-Modified: Tue, 12 Apr 2016 17:42:58 GMT$
-   RespHeader     Etag: f9d34a65e8c1b30245c2f12534348ff9$
-   RespHeader     X-Timestamp: 1460482977.61998$
-   RespHeader     Content-Type: image/png$
-   RespHeader     X-Trans-Id: txf52283ea65004e578ddfe-0058203d84$
-   RespHeader     Date: Mon, 07 Nov 2016 08:38:28 GMT$
-   RespHeader     X-Varnish: 363192 658416$
-   RespHeader     Age: 6516$
-   RespHeader     Via: 1.1 varnish-v4$
-   VCL_call       DELIVER$
-   RespHeader     X-Varnish-Cache: HIT$
-   VCL_return     deliver$
-   Timestamp      Process: 1478514424.525880 0.000078 0.000078$
-   RespHeader     Accept-Ranges: bytes$
-   Debug          "RES_MODE 2"$
-   RespHeader     Connection: keep-alive$
-   Timestamp      Resp: 1478514424.525908 0.000106 0.000028$
-   ReqAcct        415 0 415 394 4774 5168$
-   End            $

【问题讨论】:

  • 或更简单的perl -ne 'if(/Begin|ReqURL|Varnish-Cache/){ s/^-\s*//; s/^\S+\K\s+(.*\S)\s*/="$1",/; print}' | sed 's/,$/\n/'
  • @Sundeep,我试过你的命令 - sudo varnishlog -c | perl -ne 'if(/Begin|ReqURL|Varnish-Cache/){ s/^-\s*//; s/^\S+\K\s+(.*\S)\s*/="$1",/; print}' | sed 's/,$/\n/',我没有看到任何输出
  • @Sundeep,命令sudo varnishlog -c | perl -ne 'print if(/Begin|ReqURL|Varnish-Cache/)' 的工作方式与grep 相同。我用我的 perl 版本更新了我的帖子。
  • 查看 sed 是否有效.. sed -nE '/Begin|ReqURL|Varnish-Cache/ {s/^-\s*//; s/^(\S+)\s+(.*\S)\s*/\1="\2"/; p}' | paste -sd, .. 如果您的 sed 不支持 -E,请使用 -r
  • @Sundeep,尝试了这个 - sudo varnishlog -c | sed -nE '/Begin|ReqURL|Varnish-Cache/ {s/^-\s*//; s/^(\S+)\s+(.*\S)\s*/\1="\2"/; p}' | paste -sd,但得到错误paste: option requires an argument -- 'd'

标签: unix sed grep varnish


【解决方案1】:

也许这对你有帮助;

sudo varnishlog -c | grep --line-buffered -E 'Begin|ReqURL|Varnish-Cache' |  sed -u 's/-   //;s/   */="/;s/$/"/' | tr '\n' ','

【讨论】:

    猜你喜欢
    • 2013-12-27
    • 2021-05-19
    • 2020-05-06
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多