将变量分配给cut -f字段

时间:2019-04-10 05:07:19

标签: awk sh cat

使用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 个答案:

答案 0 :(得分:2)

要从给定的输入中获得所需的输出,请尝试:

$ 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当然可以设置为shell变量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变量ik设置为shell变量$i$k的值。

  • -F::

    这会将字段分隔符设置为::

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

    如果当前行的第一个字段等于变量k,则将变量n设置为当前行号NR加上i

  • n==NR

    如果当前行号NRn,则打印此行。

答案 1 :(得分:2)

使用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 :(得分:1)

假设您想建立在your previous question上,而不是提出一种完全不同的方法

$ 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