如何像Python枚举一样识别文件中的列数?

如何像Python枚举一样识别文件中的列数?

样本文件:

11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64

在Python中,使用枚举函数可以很容易地识别字段的数量。例如

>>> i = '11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64'
>>> 

分割字符串

>>> i.split()
['11:34:21.590434', 'IP', '10.10.1.30', '>', '10.10.1.217:', 'ICMP', 'echo', 'reply,', 'id', '27948,', 'seq', '1,', 'length', '64']
>>> 

把它放在新变量上,比方说j

>>> j = i.split()
>>> 

枚举一下

>>> for i in enumerate(j, 1): i
... 
(1, '11:34:21.590434')
(2, 'IP')
(3, '10.10.1.30')
(4, '>')
(5, '10.10.1.217:')
(6, 'ICMP')
(7, 'echo')
(8, 'reply,')
(9, 'id')
(10, '27948,')
(11, 'seq')
(12, '1,')
(13, 'length')
(14, '64')
>>> 

所以,如果我想用awk打印出源IP,即字段3,这比用肉眼手动识别它更容易。

wolf@linux:~$ awk '{print $3}' file.txt 
10.10.1.30
wolf@linux:~$ 

我知道在 Linux/Bash 中可以做类似的事情,我只是还没有弄清楚。

更新

我知道使用以下方法很容易获得列数NF

wolf@linux:~$ awk '{ print NF }' file.txt
14
wolf@linux:~$ 

但我想在这里实现的是识别每一列及其数字。可能类似于 Python 枚举输出。

答案1

您可以使用 AWK 枚举字段:

awk '{ for (i = 1; i <= NF; i++) print i, $i }' file.txt

或与trnl

tr ' ' '\n' < file.txt | nl

head -n1如果您想使用 停在第一行末尾,则通过第一个过滤tr;否则字段将跨行计数。)

您还可以使用 Bash 数组找到这一点(取决于IFS):

arr=($(head -n1 file.txt))
i=0
while [[ i -lt ${#arr[@]} ]]; do
    printf "%d %s\n" $((i+1)) "${arr[$i]}"
    ((i++))
done

答案2

使用 GNU awk 进行多字符RS\s简写[[:space:]]

$ awk -v RS='\\s+' '{print NR, $0}' file
1 11:34:21.590434
2 IP
3 10.10.1.30
4 >
5 10.10.1.217:
6 ICMP
7 echo
8 reply,
9 id
10 27948,
11 seq
12 1,
13 length
14 64

它假设您的输入中只有 1 行,就像您问题中的示例一样。

答案3

我猜没有任何正确的解决方案而不是斯蒂芬·基特。但如果你只需要IP地址你可以使用下面

tr ' ' '\n' <<<'11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64' | grep IP -A1 | grep -v IP

答案4

解决方案与sed

$ sed -n '/1/{s/ /\n/g;p}' < file.txt | nl
     1  11:34:21.590434
     2  IP
     3  10.10.1.30
     4  >
     5  10.10.1.217:
     6  ICMP
     7  echo
     8  reply,
     9  id
    10  27948,
    11  seq
    12  1,
    13  length
    14  64
       
$ 

相关内容