Awk를 사용하여 패턴과 일치하는 레코드 수 계산

Awk를 사용하여 패턴과 일치하는 레코드 수 계산

그래서 마지막 시스템 재부팅 이후 마지막으로 로그인한 클래스를 표시하는 파일을 생성하라는 지시를 받았고 이제 문자열이 포함된 줄 수를 last > lastloggedin계산/결정하는 이름의 Awk 스크립트를 작성하라는 요청을 받았습니다 .myawklastloggedinCFS264

난 해냈어grep -c CFS264 lastloggedin

답변1

먼저 다음을 awk사용하여 파일에서 문자열이 포함된 행을 검색할 수 있습니다.

$ awk '/CFS264/ { .... }' lastloggedin

비트는 { .... }해당 문자열의 줄 수를 계산하는 데 필요한 명령이 됩니다. 위의 작업이 작동하는지 확인하려면 print $0검색 문자열이 포함된 행을 간단히 인쇄하기 위해 a를 사용할 수 있습니다.

$ awk '/CFS264/ { print $0 }' lastloggedin

계산에 관해서는 "awk counter"를 검색하면 "awk counter"라는 제목의 Q&A를 보게 될 것입니다.awk를 사용하여 레코드 수 계산. 여기에 표시된 방법은 설명하는 내용에 충분합니다.

$ awk '/CFS264/ {count++} END{print count}' lastloggedin

$ last > lastloggedin

$ awk '/slm/ {count++} END {print count}' lastloggedin 
758

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

노트:CFS264 필드가 속한 출력을 표시하지 않았습니다 last. 사용자 이름이라고 가정하면 awk다음과 같이 해당 필드만 검색하도록 명령을 추가로 제한할 수 있습니다.

$ awk '$1=="CFS264" { print $0 }' lastloggedin

답변2

다음 예에서는 lastloggedin파일 없이 내가 언급된 횟수를 계산합니다.

$ last | awk '$1=="yeti" { ++count } END { print count }' 
106

이 파일을 사용해야 한다고 주장 lastloggedin하거나 강제로 사용해야 하는 경우 다음과 같이 할 수 있습니다.

$ last > lastloggedin
$ awk '$1=="yeti" { ++count } END { print count }' lastloggedin
106

$1~/some_chars/특정 문자가 포함된 모든 사용자 이름을 가져오거나 다음 $1~/^prefix/으로 시작하는 이름만 일치시키는 데 사용됩니다 prefix.

$ last | awk '$1~/et/ { ++count } END { print count }'
106
$ last | awk '$1~/^ye/ { ++count } END { print count }'
106


첨부된:

더 많은 팁을 보려면 man awk... ;-)

awk매우 가치가 있습니다. 짧은 학습 시간 후에는 많은 일을 할 수 있습니다...

답변3

마지막 시간에는 이전 다시 시작으로 인한 사용자 로그인이 포함될 수 있습니다. 따라서 다음은 마지막 재부팅 이후 사용자만 인쇄합니다.

last | awk 'NR==1,$1=="reboot"{if ($1 ~ /cfs264/ ) { count+=1; }}END{ print count; }'

awk 명령의 첫 번째 부분은 첫 번째 줄부터 시작하여 첫 번째 열이 "reboot"일 때까지의 범위를 지정합니다.

관련 정보