텍스트 파일에서 시간 추출

텍스트 파일에서 시간 추출

그래서 저는 텍스트 파일에 저장된 웹 서버 핑에서 왕복 시간을 추출하는 쉘 스크립트를 Linux에서 작성하려고 합니다. 기본적으로 제가 가지고 있는 것은 텍스트 파일입니다.

    PING e11699.b.akamaiedge.net (104.100.153.112) 56(84) bytes of data.
    64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=1 ttl=60 time=17.2ms
    64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=2 ttl=60 time=12.6ms
    64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=3 ttl=60 time=11.7ms
    ... (a bunch more ping responses here)
    --- e11699.b.akamaiedge.net ping statistics ---
    86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
    rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2

그래서 결국 sed를 사용하여 텍스트 파일에서 17.2, 12.6, 11.7 이상만 추출하려고 했습니다. 내 sed 라인은 다음과 같습니다.

    sed 's/.*(time=\([0-9]*\(\.[0-9]*\)\{0,1\}\) ms/\1/' pingoutput.txt | sort -n > sortedtime.txt 

이 줄은 필요한 모든 시간을 성공적으로 추출하고 정렬하지만 ping 텍스트 파일에서 필요하지 않은 몇 줄도 추출합니다. 생성되는 텍스트 파일은 다음과 같습니다.

--- e11699.b.akamaiedge.net ping statistics ---
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2
11.7
12.6
17.2
...
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms

어쨌든 텍스트 파일에서 원치 않는 "---e11699"를 "pipe 2"로, "86400 packet"을 "86532481ms" 줄로 추출하는 것을 방지할 수 있는 방법이 있다면 여러분의 도움에 매우 감사하겠습니다!

답변1

나는 이 sed를 사용했습니다:

sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n

예제 파일( times)에서:

PING e11699.b.akamaiedge.net (104.100.153.112) 56(84) bytes of data.
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=1 ttl=60 time=17.2ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=2 ttl=60 time=12.6ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=3 ttl=60 time=11.7ms
... (a bunch more ping responses here)
--- e11699.b.akamaiedge.net ping statistics ---
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2

나는 다음과 같은 결과를 얻습니다.

sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n
11.7
12.6
17.2


나는 -n원하지 않는 줄을 제거하기 위해 이 스위치를 사용했습니다. 에서 man sed:

-n By default, each line of input is echoed to the standard output after all of the commands have been applied to it. The -n option suppresses this behavior.

답변2

정규식을 grep사용 하면 문제가 되지 않습니다.pcre

$ grep -oP 'time=\K[0-9.]+' ip.txt | sort -n
11.7
12.6
17.2
  • -o일치하는 패턴만 인쇄
  • -PPCRE 정규식 사용
  • time=\K출력의 일부가 아닌 앞으로 되돌아보기
  • [0-9.]+하나 이상의 숫자와 .문자
  • sort -n숫자순으로 정렬

단독으로 사용 perl:

$ perl -nle 'push(@a,/time=\K([0-9.]+)/g); END{ print foreach sort {$a <=> $b} @a }' ip.txt 
11.7
12.6
17.2
  • 일치하는 패턴으로 배열을 채운 다음 마지막에 숫자로 정렬된 배열을 인쇄합니다.

답변3

grep 'time=' pingoutput.txt | awk '{print $8}'

관련 정보