그래서 다음과 같은 줄이 포함된 텍스트 파일이 있습니다.
http://sg.ovies.m/.ss/ (Status: 200) [Size: 128]
http://sg.mo.v/.dev/ (Status: 200) [Size: 12328]
http://som.b/.hal/ (Status: 200) [Size: 1238]
http://m.cb/.ho/ (Status: 200) [Size: 0]
http://sm.jo/.hK/ (Status: 200) [Size: 0]`
Size가 1에서 100 사이인 행만 grep하고 싶습니다.
따라서 출력은 다음과 같습니다.
http://sg.ovies.m/.ss/ (Status: 200) [Size: 128]
http://sg.mo.v/.dev/ (Status: 200) [Size: 12328]
http://som.b/.hal/ (Status: 200) [Size: 1238]
grep이나 awk를 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
Awk를 사용하면 다음과 같은 작업이 쉬워집니다.
awk '{size=$5; sub(/]/, "", size); size=size+0; if (size <= 100 && size >= 1) {print $0 } }' file_to_read.txt
다음을 좀 더 친근하게 작성해 보세요.
awk '{
# create a new variable "size".
# items are separated by spaces, we need the 5th item
size=$5;
# remove the trailing "]"
sub(/]/, "", size);
# make sure size is an int
size=size+0;
# Choose rows with seize between 1 and 100
if (size <= 100 && size >= 1) {
# print the whole line
print
}
}' file_to_read.txt
답변2
이 :
문자가 입력의 3개 위치에만 나타나는 것을 고려하면 이를 필드 구분 기호로 사용한 다음 비교를 위해 하위 문자열로 숫자를 추출할 수 있습니다(선행 공백을 고려).
awk -F':' '{size=substr( $NF,2,length($NF)-2 ); if((size>=1)&&(size<=100)) print }' input.txt
"크기: 1에서 100 사이"를 요청했습니다. 그러나 예제 출력에는 "크기가 1보다 큽니다"라고 표시됩니다. 그렇다면 if 문을 다음과 같이 단순화할 수 있습니다.if(size > 1) print
답변3
다음 패턴을 사용하면 됩니다.
grep -E 'Size: (?:100|[1-9]|[0-9]{2})]' test
나는 grep에게 확장 정규식 구문( )을 사용 하고 0에서 99 사이의 값을 -E
일치시키도록 지시했습니다 .100
Size: