Присвойте переменную полю cut -f - PullRequest
3 голосов
/ 10 апреля 2019

Используя cut, я хочу знать, как использовать его как:

awk -v id=3 -v RS= -F '::'  '($1==id) {print $3}' jenny  | a=1 ;cut -d$'\n' -f$a

Я хочу использовать его в цикле, где i заменяется, например, -f 1 ...3


Ввод

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::if [ -z "$(grep -l "hard core" /etc/security/limits.conf /etc/security/limits.d/*)" ]; then echo "empty"; else echo -e "$(grep -l "hard core" /etc/security/limits.conf /etc/security/limits.d/*)"; fi::
 /etc/security/limits.conf
/etc/security/limits.d/test

4::sysctl fs.suid_dumpable::
 fs.suid_dumpable = 0

5::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-09 07:56:19.000000000 +0500
Modify: 2019-03-30 19:22:13.000000000 +0500
Change: 2019-03-30 19:22:13.000000000 +0500

Ожидаемый вывод

 /etc/security/limits.conf
    /etc/security/limits.d/test

В качестве поля 1 и поля в настоящее время все входит в $3.Я попытался отделить с новой строки в awk;это, кажется, не ловит.

Ответы [ 3 ]

2 голосов
/ 10 апреля 2019

С sed:

$ id=3; sed -En "/^$id::/,/^$/{/^[[:blank:]]*\//p}" jenny 
 /etc/security/limits.conf
/etc/security/limits.d/test

Пояснения:

  • Ваша оболочка интерпретирует команду и заменит id ее значением.
  • /^$id::/,/^$/{} область действия {} будет выполняться только между строками, начинающимися со значения id, за которым следует :: (/^$id::/) до пустой строки (/^$/)
  • /^[[:blank:]]*\//p для строк, которые начинаются с некоторого пустого класса символов POSIX (например, пробел / табуляция), за которым следует / печать строки. Это напечатает ваши два пути.

Чтобы указать строку :

$ id=3; line=1; sed -En "/^$id::/,/^$/{/^[[:blank:]]*\//p}" jenny | cut -d$'\n' -f"$line"
 /etc/security/limits.conf
$ id=3; line=2; sed -En "/^$id::/,/^$/{/^[[:blank:]]*\//p}" jenny | cut -d$'\n' -f"$line"
/etc/security/limits.d/test
$ id=3; line=1; sed -En "/^$id::/,/^$/{/^[[:blank:]]*\//p}" jenny | sed -n "${line}p"
 /etc/security/limits.conf
$ id=3; line=2; sed -En "/^$id::/,/^$/{/^[[:blank:]]*\//p}" jenny | sed -n "${line}p"
/etc/security/limits.d/test
2 голосов
/ 10 апреля 2019

Чтобы получить желаемый результат от заданного входа, попробуйте:

$ awk '/^$/{f=0} f{print} /3::/{f=1}' file
 /etc/security/limits.conf
/etc/security/limits.d/test

Чтобы получить только одну строку вывода, выбранную с помощью переменной i:

$ awk -v i=1 '/3::/{n=NR+i} n==NR' file
 /etc/security/limits.conf
$ awk -v i=2 '/3::/{n=NR+i} n==NR' file
/etc/security/limits.d/test

awkПеременная i, конечно, может быть установлена ​​на значение переменной оболочки i:

$ i=2
$ awk -v i="$i" '/3::/{n=NR+i} n==NR' file
/etc/security/limits.d/test

Раздел также может быть выбран из переменной:

$ i=2
$ k=3
$ awk -v i="$i" -v k="$k" -F:: '$1==k{n=NR+i} n==NR' file
/etc/security/limits.d/test

Как это работает:

  • -v i="$i" -v k="$k"

    Эти опции устанавливают переменную awk i и k равными значениям переменных оболочки $i и $k соответственно.

  • -F::

    Устанавливает разделитель полей на ::.

  • $1==k {n=NR+i}

    Если первое поле текущей строки равно переменной k, тогда для переменной n укажите номер текущей строки, NR, плюс i.

  • n==NR

    Если текущий номер строки, NR, равен n, то выведите эту строку.

1 голос
/ 10 апреля 2019

Предполагая, что вы хотите использовать ваш предыдущий вопрос , вместо того, чтобы придумать совершенно другой подход

$ awk -v id=3 -v lineNr=1 -v RS= -F '::'  '$1==id{ split($3,lines,/\n/); print lines[lineNr+1] }' file
 /etc/security/limits.conf
$ awk -v id=3 -v lineNr=2 -v RS= -F '::'  '$1==id{ split($3,lines,/\n/); print lines[lineNr+1] }' file
/etc/security/limits.d/test
...