다음 문제를 상상해 보십시오. 표준 Apache 로그가 있습니다. 특정 키워드가 포함된 요청 URL을 필터링하고 싶습니다. 매우 간단합니다.
$ grep "keyword" somedomain-access.log
이는 잘 작동하지만 충분히 강력하지는 않습니다. 즉, 100% 필요한 대로 작동하지 않습니다. 키워드가 "GET"이라고 가정하면 (웹 사이트에 따라) 거의 모든 행이 grep 명령과 일치됩니다.
우리는 다음과 같은 전처리를 수행합니다.
$ cut -d" " -f['i'th field containing the url] somedomain-access.log |
grep "keyword"
이것은 조금 더 잘 작동하지만 이제는 모든 상황별 정보, 즉 명령으로 삭제한 다른 필드를 잃습니다 cut
.
이제 이 문제는 나를 점점 더 괴롭히고 있습니다. 물론 이 특정한 경우에는 awk를 사용할 수 있지만 일반적으로 일반적인 경우에는 명령만으로는 awk
충분하지 않습니다.
쉘이 아닌 언어에서는 객체의 멤버를 확인하고 작업을 수행하기만 하면 됩니다. Scala에서 사용되는 Apache 로깅 예제를 다시 사용하면,
> // Preprocessed list of apache log into `records`
> val records = List(AccessLogRecord(...), AccessLogRecord(...), ...)
> val recordsWithKeyword = records.filter(_ => _.request == "keyword")
결과는 여전히 목록이며, 각 항목(이 경우 AccessLogRecord)에는 날짜, HTTP 코드 등과 같은 모든 상황별 정보가 포함되어 있습니다.
예를 들어 특정 애플리케이션에 의존하지 않고 파이프, 리디렉션 등을 사용하여 명령줄에서 동일한 작업을 수행하려면 어떻게 해야 합니까 awk
?