Вложенный awk захватывает определенную строку из второго совпадения и отображает - PullRequest
1 голос
/ 09 апреля 2019

У меня есть содержимое файла как

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 новой строкой (хочу пропустить сначала ::)

\ 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 голосов
/ 09 апреля 2019

Это все, что вы пытаетесь сделать?

$ awk -v id=4 -v str='Access: (0644/-rw-r--r--)' -v RS= -F':' '($1==id) && index($0,str)' file
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...