为什么 grep -A n 给出的行数比 n 多?

为什么 grep -A n 给出的行数比 n 多?

我正在使用 dscacheutil 命令验证某些用户的 UID/GID。将 grep 与 -A 标志一起使用可以满足我的需要,但行数没有意义。输出如下:

Edit8:~ edit08$ dscacheutil -q user | grep -A 6 "userX"
name: userX
password: ********
uid: 2063
gid: 1021
dir: /Users/userX
shell: /bin/sh
gecos: User X

name: userA
password: ********
uid: 2013
Edit8:~ edit08$ dscacheutil -q user | grep -A 4 "userX"
name: userX
password: ********
uid: 2063
gid: 1021
dir: /Users/userX
shell: /bin/sh
gecos: User X

name: userA
Edit8:~ edit08$ dscacheutil -q user | grep -A 2 "userX"
name: userX
password: ********
uid: 2063
--
dir: /Users/userX
shell: /bin/sh
gecos: User X
Edit8:~ edit08$ dscacheutil -q user | grep -6 "userX"
uid: 2012
gid: 1010
dir: /Users/userB
shell: /bin/sh
gecos: User B

name: userX
password: ********
uid: 2063
gid: 1021
dir: /Users/userX
shell: /bin/sh
gecos: User X

name: userA
password: ********
uid: 2013
Edit8:~ edit08$ dscacheutil -q user | grep -A 2 "userX"
name: userX
password: ********
uid: 2063
--
dir: /Users/userX
shell: /bin/sh
gecos: User X
Edit8:~ edit08$ dscacheutil -q user | grep -A 3 "userX"
name: userX
password: ********
uid: 2063
gid: 1021
dir: /Users/userX
shell: /bin/sh
gecos: User X

Edit8:~ edit08$ 

虽然我的逻辑规定行数必须是 6,但实际上是 3。

有人吗?

谢谢

答案1

我标记了与~~~模式匹配的行,并对其后的行进行了编号:

    Edit8:~ edit08$ dscacheutil -q user | grep -A 6 "userX"
~~~ name: userX
 1  password: ********
 2  uid: 2063
 3  gid: 1021
~~~ dir: /Users/userX
 1  shell: /bin/sh
 2  gecos: User X
 3  
 4  name: userA
 5  password: ********
 6  uid: 2013


    Edit8:~ edit08$ dscacheutil -q user | grep -A 3 "userX"
~~~ name: userX
 1  password: ********
 2  uid: 2063
 3  gid: 1021
~~~ dir: /Users/userX
 1  shell: /bin/sh
 2  gecos: User X
 3

正如您所看到的,永远不会向您显示比相关匹配之后grep -A n更多的行;n只是有些匹配项靠近,导致包含的行很长。

答案2

从手册页:

-A NUM,--after-context=NUM
在匹配行之后打印 NUM 行尾随上下文。在连续的匹配组之间放置一条包含组分隔符 (--) 的行。使用 -o 或 --only-matching 选项,这不起作用并给出警告。

在您给出的所有示例中,每个实例后面userX都跟着正确的上下文行数。如果另一个实例userX出现在另一个实例的上下文中,则上下文会扩展到第二个实例之后的任意行。

相关内容