스트림의 라인에 대해 작업하고 컨텍스트를 보존합니다.

스트림의 라인에 대해 작업하고 컨텍스트를 보존합니다.

다음 문제를 상상해 보십시오. 표준 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?

관련 정보