将变量分配给 cut -f 字段
Assign variable to cut -f field
使用cut
,我想知道如何使用它:
awk -v id=3 -v RS= -F '::' '(==id) {print }' 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 和当前字段,它全部进入
。我尝试在 awk 中用换行符分隔;好像没听懂。
要从给定的输入中获得所需的输出,请尝试:
$ 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:: '==k{n=NR+i} n==NR' file
/etc/security/limits.d/test
工作原理:
-v i="$i" -v k="$k"
这些选项将 awk 变量 i
和 k
分别设置为 shell 变量 $i
和 $k
的值。
-F::
这会将字段分隔符设置为 ::
。
==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::/
) 的行之间执行,直到空行 (/^$/
)
/^[[:blank:]]*\//p
用于以某些 POSIX 空白字符 class(例如 space/tab)开头的行,然后是 /
打印该行。这将打印您的两条路径。
指定行:
$ 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 '::' '==id{ split(,lines,/\n/); print lines[lineNr+1] }' file
/etc/security/limits.conf
$ awk -v id=3 -v lineNr=2 -v RS= -F '::' '==id{ split(,lines,/\n/); print lines[lineNr+1] }' file
/etc/security/limits.d/test
使用cut
,我想知道如何使用它:
awk -v id=3 -v RS= -F '::' '(==id) {print }' 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 和当前字段,它全部进入 。我尝试在 awk 中用换行符分隔;好像没听懂。
要从给定的输入中获得所需的输出,请尝试:
$ 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:: '==k{n=NR+i} n==NR' file
/etc/security/limits.d/test
工作原理:
-v i="$i" -v k="$k"
这些选项将 awk 变量
i
和k
分别设置为 shell 变量$i
和$k
的值。-F::
这会将字段分隔符设置为
::
。==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::/
) 的行之间执行,直到空行 (/^$/
)/^[[:blank:]]*\//p
用于以某些 POSIX 空白字符 class(例如 space/tab)开头的行,然后是/
打印该行。这将打印您的两条路径。
指定行:
$ 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 '::' '==id{ split(,lines,/\n/); print lines[lineNr+1] }' file
/etc/security/limits.conf
$ awk -v id=3 -v lineNr=2 -v RS= -F '::' '==id{ split(,lines,/\n/); print lines[lineNr+1] }' file
/etc/security/limits.d/test