嵌套的awk从第二个匹配项中显示特定字符​​串并显示

时间:2019-04-09 02:20:32

标签: bash awk sed

我的文件内容为

0::chkconfig --list autofs::
 autofs                 0:off   1:off   2:on    3:on    4:on    5:on    6:off

1::grep "^PROMPT=" /etc/sysconfig/init::
 PROMPT=yes

2::rpm -q prelink::
 prelink-0.4.0-2.el5

3::sysctl fs.suid_dumpable::
 fs.suid_dumpable = 0

4::stat /etc/motd::
   File: `/etc/motd'
  Size: 17              Blocks: 16         IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 10125343    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-04-08 07:54:03.000000000 +0500
Modify: 2019-03-30 19:22:13.000000000 +0500
Change: 2019-03-30 19:22:13.000000000 +0500

5::stat /etc/issue::
   File: `/etc/issue'
  Size: 52              Blocks: 16         IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 10125494    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-30 19:12:13.000000000 +0500
Modify: 2012-02-25 22:01:14.000000000 +0500
Change: 2019-03-30 23:54:57.000000000 +0500

我希望第一场比赛能在everything之间抓住我 :: <everything>\d::

注意: ::后跟\ n新行(想先跳过::)

regex的

\ d可以是3位999(最大)。

第二个匹配项是在第一个匹配项中搜索 例如5::

Access: (0644/-rw-r--r--)

获取权限0644

第二个匹配规则的标准不是固定的,并且会根据要求进行更改,但是第一个匹配规则是相同的。

最终匹配的输出只是匹配的字符串,而不是整个记录或结果。

到目前为止,我已经尝试过 cat org_op.2019.04.08-12.49.38 | awk 'f{print;f=0} /^3::/{f=1}'

这会给我

` fs.suid_dumpable = 0`

但不能缩放为多行匹配,只能在匹配下方提供1行

我也在尝试使用awk -F [::,\d""],但是我没有在括号之间得到\ d正则表达式匹配。

  

最终输出

4::stat /etc/motd::
   File: `/etc/motd'
  Size: 17              Blocks: 16         IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 10125343    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-04-08 07:54:03.000000000 +0500
Modify: 2019-03-30 19:22:13.000000000 +0500
Change: 2019-03-30 19:22:13.000000000 +0500
  

条件#1          用户要输入哪个块,例如开始标记\ d ::,其中'\ d'是用户提供的,并且它将在上述新块开始之前结束。

     

条件#2          参见fd00h/64768d,但是此条件将被更改,并且对于变量匹配的每个块都是唯一的,我希望可以根据这种格式要求来增加awk。

注意:从用户提供的信息中,我的意思是将其作为变量提供,例如$ var

测试

cat org_op.2019.04.08-12.49.38 | awk -v id=4 -v RS= -F ':' '($1==id) && $17~/\(([0-9]+)\// { print $17}'

(0644/-rw-r--r--) Uid

实际上,我希望此正则表达式匹配/\([0-9][0-9][0-9][0-9]\//) 0644

1 个答案:

答案 0 :(得分:0)

这就是您要尝试的全部吗?

Task.Delay