sed 명령을 사용하여 10000 이하 항목에 대한 텍스트 파일을 검색합니다.

sed 명령을 사용하여 10000 이하 항목에 대한 텍스트 파일을 검색합니다.

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당신은 quit. 그러나 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

관련 정보