
sed
명령을 사용하여 파일에서 10000 이하의 모든 항목을 검색하려고 하는데 이 불완전한 sed
검색 문자열은 10000 이상의 항목에 대한 것일 수 있습니다.
sed -n "/[0-9][0-9][0-9][0-9][0-9]/ q" logfile
답변1
다음 방법을 사용하여 수행할 수도 있습니다.
$ sed -n "/^[0-9]\{0,4\}$\|10000/p" logfile
예
다음과 같은 샘플 파일이 있다고 가정해 보겠습니다 logfile
.
$ seq 9900 10050 | sed 's/$/ /' > logfile
결과적으로 파일은 logfile
다음과 같습니다.
$ head -5 logfile
9900
9901
9902
9903
9904
$ tail -5 logfile
10046
10047
10048
10049
10050
sed 's/$/ /'
샘플 파일을 생성할 때 위의 줄 덕분에 이러한 각 줄 뒤에는 후행 공백이 있습니다 .
이제 위 명령을 실행하면 다음과 같습니다 sed
.
$ sed -n "/^[0-9]\{1,4\}[^0-9]\|10000/p" logfile | tail -5
9996
9997
9998
9999
10000
우리는 모든 것을 최대 10000까지 얻을 수 있으며 그 이상은 없습니다.
작동 원리
위의 sed
작업은 숫자 범위 0-9로 시작하고 길이가 1에서 4 사이인 행을 찾는 방식으로 작동합니다. 에 대한 표기법이 sed
이 "/^[0-9]\{1,4\}[^0-9]
부분을 수행합니다. [^0-9]
끝에 있는 표기법 에는 0-9가 아닌 문자가 나와 있습니다. 이렇게 하면 sed
더 긴 숫자의 하위 문자열 일치가 중지됩니다.
\|10000
나머지 문자열에 비해 약간 독특한 패턴이기 때문에 10000과 일치합니다 . 후행은 결과를 인쇄하도록 p
지시합니다 .sed
대안으로 grep 사용
의 사용은 sed
실제로 검색에 적합한 도구가 아닙니다. grep
대신에 이것을 사용하는 것이 더 나을 것입니다 .
$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | head -5
9900
9901
9902
9903
9904
$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | tail -5
9996
9997
9998
9999
10000
위의 명령은 10000 이하의 숫자 문자열을 포함하는 모든 줄을 찾습니다. 은 \b
문자열 앞이나 뒤의 테두리를 나타냅니다.
답변2
Perl을 사용하면 이를 더 쉽고 읽기 쉽게 만들 수 있습니다.
perl -nE 'say for grep { $_ <= 10_000 } /([0-9]+)/g' your_file
답변3
sed '/[0-9]/!d;/10000/q' <log.file
항목이 순차적인 순서로 되어 있는 한 줄에 숫자가 포함되도록 지정하기만 하면 !
됩니다 d
. 그리고 라인에 도착하면 10000
당신은 q
uit. 그러나 10000은 여전히 인쇄됩니다. 이는 인쇄된 마지막 줄이 됩니다.
고정할 수 있다면 훨씬 더 좋을 것입니다. 아마도 다음과 같이 줄의 시작 부분에 고정할 수 있습니다.
sed '/^[0-9]/!d;/^10000/q' <log.file
그게 더 확실하고 빠르겠죠.
그러나 slm이 지적했듯이 grep
더 빠를 것입니다.
답변4
sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile