web-dev-qa-db-ja.com

Awkでパターンに一致するレコードをカウントする

だから私はlast > lastloggedinを行うように言われました。これは、最後のシステム再起動以降のクラスの最後のログインを示すファイルを作成し、myawkという名前のAwkスクリプトを書くように求められます。文字列CFS264を含むlastloggedinの行数。

完了しましたgrep -c CFS264 lastloggedin

13
TayshaunS

はじめに、awkを使用して、次のような文字列を含むファイル内の行を検索できます。

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

{ .... }のビットは、その文字列で行数を集計するために必要なコマンドになります。上記が機能していることを確認するには、print $0を使用して、検索文字列を含む行を出力します。

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

カウントに関して、「awkカウンター」を検索すると、これに遭遇しますSO 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
21
slm

次の例は、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は非常にやりがいのあるものです。非常に短時間の学習で多くのことができるようになります...

5
user62916

最後には、前回の再起動からのユーザーログインが含まれます。そのため、以下は最後の再起動以降のユーザーのみを印刷します。

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

Awkコマンドの最初の部分は範囲を指定します-最初の行から始まり、最初の列が「再起動」されるまで。

2
DarkHeart