샘플 파일:
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를 사용하여 필드 3인 소스 IP를 인쇄하려면 육안으로 수동으로 식별하는 것보다 쉽습니다.
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
또는 tr
및 nl
:
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
다중 문자 RS
및 \s
약어 에 GNU awk 사용 [[: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
$