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
工作原理:
这些选项分别将awk变量-vi=“$i”-vk=“$k”
和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>)
对于以某些POSIX空白字符类(例如空格/制表符)开头,后跟/^[[:blank:][]*\//p
的行,打印该行。这将打印您的两条路径/
$ 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
来更改。