sed 또는 다른 도구를 사용하여 파일에서 숫자를 추출하는 방법은 무엇입니까?

sed 또는 다른 도구를 사용하여 파일에서 숫자를 추출하는 방법은 무엇입니까?

이 형식의 파일이 있습니다

[2014/05/01 10:48:26 | 13963 | DEBUG] 프로세스를 완료하는 데 11.16837501525879초가 걸렸습니다.

그래서 나는 이와 같은 수천 개의 줄을 가지고 있고 내가 시도한 11.16837501525879부분을 "추출"하고 싶습니다
.

 sed -e 's/^.* (\d+\.\d*)/\1/g' logfile.txt > out.txt  

하지만 나는 다음을 얻습니다.

sed: -e expression #1, char 21: invalid reference \1 on `s' command's RHS  

여기서 무엇을 할 수 있나요?

답변1

sed기본 정규 표현식은 기본적으로 사용되며 BRE에는 알려지지 않았습니다 \d. 다음은 몇 가지 다른 방법입니다.

  1. sed

    sed -r 's/.* ([0-9]+\.*[0-9]*).*?/\1/' logfile.txt > outfile.txt
    

    -r괄호를 이스케이프 처리하지 않는 데 필요합니다 .

  2. perl

    perl -pe 's/.* (\d+\.*\d*).*/$1/' logfile.txt > outfile.txt
    
  3. grep

    grep -Po '.* \K\d+\.*\d*' logfile.txt > outfile.txt
    

이들은 모두 find를 채우는 기본 방법을 사용합니다.모두한 줄에서 앞에 공백이 오는 숫자 그룹입니다. 줄에 표시할 수 있는 숫자 세트 수에 따라 입력 줄이 항상 표시하는 형식인 경우 더 안전한 접근 방식은 다음과 같습니다.

grep -Po 'took \K\d+\.*\d*' logfile.txt 

답변2

sed의 그룹화 대괄호는 백슬래시로 묶어야 합니다. 또한 sed는 이를 지원하지 않습니다 \d. 또한 이러한 단어를 제거해야 합니다.뒤쪽에숫자:

sed -e 's/^.* \([0-9]\+\.[0-9]*\) .*/\1/g'

그런데, 점은 항상 거기에 있지만 소수점은 선택 사항인가요? 12.기대값은 아닌 것 같습니다.

답변3

awk를 사용하여 11번째 열(공간 구분에 따라 결정됨)을 인쇄할 수 있습니다.

awk '{ print $11 }' logfile.txt > output

관련 정보