nl 和 tail 的行号之间存在差异

Discrepency between line numbers from nl and tail

使用以下命令时:

nl /etc/snort/snort.conf | grep output

我得到以下输出:

 33  #  6) Configure output plugins
445  #  Step #6: Configure output plugins
450  #  output unified2: filename snort.log, limit 128, mpls_event_types, vlan_event_types

所以,我可以看到 Step #6: Configure output plugins 在第 445 行。

我想输出第445行加上前五行(440-444 + 445),所以我用:

tail -n+440 /etc/snort/snort.conf | head -n 6

然而,这给了我完全不同的结果。所以,我用行号搜索整个文件,调查并确实看到 # Step #6: Configure output plugins 行在第 445 行...

在使用 tail 命令反复试验之后,我终于得到了我想要的结果,但是我最初认为在 445 上的那一行实际上是在 529 上。我可以通过将之前的命令编号更改为来验证这一点:

tail -n+524 /etc/snort/snort.conf | head -n 6

然后我得到了最初预期的结果,显示了五行配置文件,# Step #6: Configure output plugins 作为输出的最后一行。

为什么感知到的行号之间存在差异(445 与 529)?

看看 nl 的原始输出。它不对空行进行编号。

$ nl /etc/snort/snort.conf
...
    32  ###################################################
    33  # Step #1: Set the network variables.  For more information, see README.variables
    34  ###################################################

    35  # Setup the network addresses you are protecting
    36  ipvar HOME_NET any

    37  # Set up the external network addresses. Leave as "any" in most situations
    38  ipvar EXTERNAL_NET any

    39  # List of DNS servers on your network
    40  ipvar DNS_SERVERS $HOME_NET

    41  # List of SMTP servers on your network
    42  ipvar SMTP_SERVERS $HOME_NET

    43  # List of web servers on your network
    44  ipvar HTTP_SERVERS $HOME_NET
...

使用-ba对所有行进行编号。默认值为 -bt:仅对非空行进行编号。

nl -ba /etc/snort/snort.conf | grep output

文件a.sh有5行,其中一行是空行

nl a.sh

 1   #!/bin/bash

 2  export hello="world"
 3  sh abc.sh
 4  echo 

当我计算行数时,它给了我 5 :

cat a.sh|wc -l
5

所以这意味着 head 和 tail 显然考虑空行但是 nl 只是给非空行提供行号。