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

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

이 명령을 사용하여 파일에서 10000 이하의 모든 항목을 검색하려고 하는데 이 불완전한 검색 문자열이 10000 이상의 항목에 대해 작동할 수 있을 것 sed같습니다 .sed

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더 긴 숫자 내에서 하위 문자열이 일치하는 것을 방지할 수 있습니다.

\|1000010000은 이전 문자열의 나머지 부분에 비해 약간 독특하기 때문에 일치합니다 . 꼬리는 인쇄 결과를 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. 그러나 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

관련 정보