이 명령을 사용하여 파일에서 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
더 긴 숫자 내에서 하위 문자열이 일치하는 것을 방지할 수 있습니다.
\|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
. 그러나 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