Awk 将变量指定给cut-f字段

Awk 将变量指定给cut-f字段,awk,sh,cat,Awk,Sh,Cat,使用cut,我想知道如何将其用作: awk -v id=3 -v RS= -F '::' '($1==id) {print $3}' jenny | a=1 ;cut -d$'\n' -f$a 我想在循环中使用它,其中I被替换为-f1…3 输入 0::chkconfig--list autofs:: 自动功能0:关闭1:关闭2:打开3:打开4:打开5:打开6:关闭 1::grep“^PROMPT=“/etc/sysconfig/init:: 提示=是 2::rpm-q预链接:: 预链接-

使用
cut
,我想知道如何将其用作:

awk -v id=3 -v RS= -F '::'  '($1==id) {print $3}' jenny  | a=1 ;cut -d$'\n' -f$a
我想在循环中使用它,其中
I
被替换为-f1…3


输入

0::chkconfig--list autofs::
自动功能0:关闭1:关闭2:打开3:打开4:打开5:打开6:关闭
1::grep“^PROMPT=“/etc/sysconfig/init::
提示=是
2::rpm-q预链接::
预链接-0.4.0-2.el5
3::if[-z“$(grep-l“hardcore”/etc/security/limits.conf/etc/security/limits.d/*)”;然后呼应“空”;else echo-e“$(grep-l“hardcore”/etc/security/limits.conf/etc/security/limits.d/*)”;fi::
/etc/security/limits.conf
/etc/安全性/限制d/测试
4::sysctl fs.suid_dumpable::
fs.suid_dumpable=0
5::stat/etc/motd::
文件:`/etc/motd'
大小:17块:16 IO块:4096常规文件
设备:fd00h/64768d索引节点:10125343链接:1
访问:(0644/-rw-r--r--)Uid:(0/根)Gid:(0/根)
访问时间:2019-04-09 07:56:19.000000000+0500
修改:2019-03-3019:22:13.000000000+0500
更改:2019-03-3019:22:13.000000000+0500
预期产量

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

作为字段1和字段,当前它都是
$3
。我试着在awk和newline分开;它似乎无法捕获。

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

$ 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
$ i=2
$ awk -v i="$i" '/3::/{n=NR+i} n==NR' file
/etc/security/limits.d/test
当然,awk变量
i
可以设置为外壳变量
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
$ 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
工作原理:

  • -vi=“$i”-vk=“$k”

    这些选项分别将awk变量
    i
    k
    设置为外壳变量
    $i
    $k
    的值

  • -F::

    这将字段分隔符设置为

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

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

  • n==NR

    如果当前行号
    NR
    n
    ,则打印此行

    • sed

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

      • shell将解释该命令并用其值替换
        id
      • /^$id::/,/^$/{}
        作用域
        {}
        将仅在以
        id
        值开头,后跟
        /^$id::///code>)的行之间执行,直到出现空行(
        /^$///code>)
      • /^[[: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
      

      假设你想在这个基础上再接再厉,而不是想出一个完全不同的方法

      $ 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
      

      @艾伦见更新pls@Inian请参阅更新plsI也回答了您的答案!;-)它可以作为一个符咒,但regex也可以作为值的一部分,例如
      /3
      也来自shell变量。它遵循的只是正则表达式的数字值rest格式inline@lazereyes没问题。我刚刚在答案代码的末尾添加了允许您这样做的代码。另外,请注意解释一下使用的用法
      n=NR+I
      这里是使用哪条换行符的NR的默认删除器。因此,它在awk中维护两个记录(NR),每个记录被划分为多个字段
      NR
      是指读取的记录数。默认情况下,记录由换行符分隔。可以通过设置awk记录分隔符变量,
      RS
      来更改。