이 형식의 파일이 있습니다
[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
. 다음은 몇 가지 다른 방법입니다.
sed
sed -r 's/.* ([0-9]+\.*[0-9]*).*?/\1/' logfile.txt > outfile.txt
-r
괄호를 이스케이프 처리하지 않는 데 필요합니다 .perl
perl -pe 's/.* (\d+\.*\d*).*/$1/' logfile.txt > outfile.txt
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