일치하는 패턴과 이전 줄과 일치하는 줄 수를 계산합니다.

일치하는 패턴과 이전 줄과 일치하는 줄 수를 계산합니다.

특정 캐릭터가 성공적으로 삭제된 횟수를 세고 싶습니다. 문제는 로그 파일의 한 줄에 스크립트가 문자를 삭제하려고 한다는 사실이 표시된다는 것입니다.

Prepare to remove role X

다음 줄은 삭제가 성공했는지 알려줍니다.

성공적으로 삭제되었습니다:

Delete Successful

삭제하지 못했습니다:

Failed to delete role X: error code

성공적인 문자 삭제 횟수를 계산하는 방법은 무엇입니까? 다음 grep을 사용하고 싶습니다.

grep "Delete Successful" | wc -l

하지만 위 역할과 동일하게 로그인된 정책도 제거하겠습니다. 즉:

Prepare to delete policy X
Delete Successful

또는

Failed to delete policy X: error code

한 줄에서 "역할 삭제 준비"를 검색한 후 다음 줄에 "삭제 성공"이라고 표시된 횟수를 계산할 수 있는 방법이 있습니까?

답변1

grepGNU를 사용하는 경우 grep빠르고 더러운 해결책은 다음과 같습니다.

grep -A1 "Prepare to remove role" | grep "Delete Successful" | wc -l

grep 옵션은 -A1grep에게 일치하는 줄과 일치하는 줄 다음의 줄을 인쇄하도록 지시합니다. 그런 다음 두 번째 grep은 성공적으로 삭제된 행만 인쇄합니다.

이는 "역할 X 삭제 준비 완료" 줄 바로 뒤에 "삭제 성공" 줄이 항상 따라오는 경우에만 안정적으로 작동합니다.

wc -l또한 참고: grep에는 해당 기능이 내장되어 있으므로 그럴 필요가 없습니다 .

grep -A1 "Prepare to remove role" | grep -c "Delete Successful"

답변2

awk를 사용하세요:

awk '/Delete Successful/ && last_line ~ /Prepare to remove role/ {n++}
     {last_line=$0}
     END {print n+0}'

답변3

이것이 로그에 "삭제 성공"하는 유일한 두 가지 방법이라고 가정하면 약간의 수학을 사용하는 것은 어떨까요?

SUCCESS=$(grep 'Delete Successful' | wc -l)
POLICY_COUNT=$(grep 'Prepare to delete policy X' | wc -l)
POLICY_FAIL=$(grep 'Failed to delete policy X' | wc -l)
POLICY_SUCCESS=$(( $POLICY_COUNT - $POLICY_FAIL ))
ROLE_SUCCESS=$(( $SUCCESS - $POLICY_SUCCESS ))

답변4

(순수 쉘 알고리즘은 외부 도구보다 훨씬 느린 것으로 입증되었으므로 이에 대한 모든 참조를 제거했습니다. 하지만 벤치마크 데이터는 흥미로울 수 있습니다.)

테스트 데이터:

Prepare to remove role foo
Delete Successful
Prepare to remove role bar
Failed to delete role bar: 1
Prepare to remove policy baz
Delete Successful
Prepare to remove role ban
Delete Successful
something
else
Prepare to remove role bay
Failed to delete role bar: 2
Prepare to remove role bat
Failed to delete role bar: 1

기준위 테스트 데이터를 1회 반복백만시간(예: 306MB), 3번의 인터리브 실행에서 얻은 최상의 결과, real시간 증가에 따라 정렬:

테스트 코드:

for index in {1..3}
do
    for path in grep.sh awk.sh
    do
        echo "$path:"
        time bash "$path"
        echo
    done
done

테스트 시스템: Intel Core i7 @ 3.07 GHz, 6GB RAM.

관련 정보