将变量分配给 cut -f 字段
Posted
技术标签:
【中文标题】将变量分配给 cut -f 字段【英文标题】:Assign variable to cut -f field 【发布时间】:2019-08-31 11:18:05 【问题描述】:使用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 中用换行符分隔;它似乎没有捕捉到。
【问题讨论】:
@Allan 请参阅更新 @Inian 请看更新 我也回答了你的问题! ;-) 【参考方案1】:要从给定的输入中获得所需的输出,请尝试:
$ awk '/^$/f=0 fprint /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==kn=NR+i n==NR' file
/etc/security/limits.d/test
它是如何工作的:
-v i="$i" -v k="$k"
这些选项将 awk 变量 i
和 k
分别设置为 shell 变量 $i
和 $k
的值。
-F::
这会将字段分隔符设置为::
。
$1==k n=NR+i
如果当前行的第一个字段等于变量k
,则将变量n
设置为当前行号NR
,加上i
。
n==NR
如果当前行号 NR
是 n
,则打印此行。
【讨论】:
它作为一种魅力发挥作用,但正则表达式也可以成为价值的一部分,例如/3
也来自 shell 变量。只是正则表达式的数字值休息格式,它遵循内联
@lazereyes 没问题。我刚刚添加到允许您这样做的答案代码的末尾。
还请注意使用n=NR+i
这里的解释说明NR的默认分隔符使用哪个换行符? .所以它维护两条记录(NR)
在awk中,每一个record被分成fields。 NR
是指读取的记录数。默认情况下,record 由换行符分隔。这可以通过设置 awk record separator 变量 RS
. 来改变【参考方案2】:
与sed
:
$ id=3; sed -En "/^$id::/,/^$//^[[:blank:]]*\//p" jenny
/etc/security/limits.conf
/etc/security/limits.d/test
说明:
您的 shell 将解释该命令并将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 "$linep"
/etc/security/limits.conf
$ id=3; line=2; sed -En "/^$id::/,/^$//^[[:blank:]]*\//p" jenny | sed -n "$linep"
/etc/security/limits.d/test
【讨论】:
【参考方案3】:假设您想在 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
【讨论】:
以上是关于将变量分配给 cut -f 字段的主要内容,如果未能解决你的问题,请参考以下文章