[復刻版]千匹の顔をawkは

千人の顔は、awkは

HTTPS:// linux.cn/article-11658-1.html 

三銃士

 

著者:  サンドラヘンリー・ストッカー  翻訳:  LCTT  Luming 

| 2019年12月9日午前7時05分コメント:  2  お気に入り:  2    

awk さらにいくつかの計算を行う - また、単純なテキストフィルタのコンテンツを印刷するために抽出されたデータ列を含む、シンプルなコマンド文字列を入力フィルタリング機能を提供するだけでなく。

あなただけ使用した場合  awk の行の選択、特定のテキストを、あなたはその機能の多くを逃している可能性があります。この記事では、使用して見ていきます  awk あなたはどのような他のいくつかのことを行う手助け、およびいくつかの例を提供することができます。

抽出データ列

awk 最も単純で最も一般的に使用される関数は、データ・ファイルまたはパイプ送信から特定のコンテンツを選択するために設けられています。区切り文字としてデフォルトの使用のスペースが、それは非常に簡単です。

  1. $ echo one two three four five | awk ‘{print $4}’
  2. four
  3. $ who | awk ‘{print $1}’
  4. jdoe
  5. fhenry

これは、スペースのシリーズを参照する  space か、  tab 文字。以下に示すために、awk 設けられた第一及び第四のデータからスクリーニング。

awk コマンドは、後続の方法でファイル名パラメータを追加することで、テキストファイルからデータを取得することができます。

  1. $ awk '{print $1,$5,$NF}' HelenKellerQuote
  2. The beautiful heart.

(LCTT译注:「世界で最良かつ最も美しいものを見ることができない、あるいは触れ、彼らは心で感じたことがなければなりません。」 - 海伦凯勒)

この例では、awk 最初の行、第5及び最後のフィールドを選択します。

コマンドは、  $NF 選択された各行の最後のフィールドを指定します。これは、ためている  NF 分野での彼の党の代表は、フィールドの数の数は、23である、と  $NF されている、そのフィールドの値を表しますheartそれは、文字列の最後の部分であるため、最終的な結論はまた、に含まれています。

フィールドは、任意の有用な形で印刷することができます。この例では、プリントアウト形式の日付をフィールドします。

  1. $ date | awk '{print $4,$3,$2}'
  2. 2019 Nov 22

あなたは省略した場合  awk 、文字列を出力間のコマンドフィールドインジケータカンマが押し出されます。

  1. $ date | awk '{print $4 $3 $2}'
  2. 2019Nov21

あなたはカンマを交換する場合、通常はハイフンとして使用され、awk それは二つのフィールドの値を減算しようとします-おそらくこれはあなたが望むものではありません。これは、出力に挿入され、ハイフンではありません。逆に、それはいくつかの計算を行う出力します。

  1. $ date | awk '{print $4-$3-$2}'
  2. 1997

この例では「2019」であろうと日付が「22」を減算し、仲介「-NOVを無視しています。」

あなたは、セパレータとして出力するスペース以外の文字を使用する場合は、次のことができます  OFS(出力フィールドセパレータ区切り文字出力)は、このように、区切り文字を指定します。

  1. $ date | awk '{OFS="-"; print $4,$3,$2}'
  2. 2019-Nov-22

単純なテキストを印刷

また、使用することができ  awk 、いくつかのテキストを表示するだけ。もちろん、より  awk あなたはもっと使用する場合があります  echo コマンドを。しかし、他の言葉で、と  awk スクリプトの一部、テキストはいくつかの非常に実用的な関連性を表示します。ここでは無用の例です。

  1. $ awk 'BEGIN {print "Hello, World" }'
  2. Hello, World

次の例では、より良いテキストの行を追加するために、識別データタグより合理的です。

  1. $ who | awk 'BEGIN {print "Current logins:"} {print $1}'
  2. Current logins:
  3. shs
  4. nemo

指定されたフィールド区切り文字

セパレータとしてスペースにないすべての入力。区切り記号として別の文字によってテキスト場合(例:カンマ、コロン、セミコロン)は、次のことができます  -F オプション(入力区切り文字)を教えて  awk

  1. $ cat testfile
  2. a:b:c,d:e
  3. $ awk -F : '{print $2,$3}' testfile
  4. b c,d

以下は、より多くの有用な例である-からコロンで区切られ  /etc/passwd たデータファイルを取得します:

  1. $ awk -F: '{print $1}' /etc/passwd | head -11
  2. root
  3. daemon
  4. bin
  5. sys
  6. sync
  7. games
  8. man
  9. lp
  10. mail
  11. news
  12. uucp

フィルタの内容

使用することもでき  awk コマンドフィールド評価を。たとえば、あなただけのリストにしたい  /etc/passwd ユーザアカウントで、あなたには、いくつかの3番目のフィールドのスクリーニングを行うことができます。次の例では、我々は以上のUID 1000年の焦点:

  1. $ awk -F":" ' $3 >= 1000 ' /etc/passwd
  2. nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
  3. shs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bash
  4. nemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zsh
  5. dory:x:1002:1002:Dory,,,:/home/dory:/bin/bash
  6. ...

あなたはタイトルの出力を向上させたい場合は、追加することができ  BEGIN 句を。

  1. $ awk -F":" 'BEGIN {print "user accounts:"} $3 >= 1000 ' /etc/passwd
  2. user accounts:
  3. nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
  4. shs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bash
  5. nemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zsh
  6. dory:x:1002:1002:Dory,,,:/home/dory:/bin/bash

あなたはタイトルの複数の行が必要な場合は、することができ  "\n" 、出力を分離します:

  1. $ awk -F":" 'BEGIN {print "user accounts\n============="} $3 >= 1000 ' /etc/passwd
  2. user accounts
  3. =============
  4. nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
  5. shs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bash
  6. nemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zsh
  7. dory:x:1002:1002:Dory,,,:/home/dory:/bin/bash

awkでの数値計算

awk それは驚くべき数学の能力を提供し、そして、四角開く数えることができ  log、数える  tan 、というように。

ここでの例は以下のとおりです。

  1. $ awk 'BEGIN {print sqrt(2019)}'
  2. 44.9333
  3. $ awk 'BEGIN {print log(2019)}'
  4. 7.61036

詳細学びたい  awk コンピューティングパワーの数学、あなたは「を参照してくださいすることができます使用数学的な計算のawk」の記事を。

awkスクリプト

また、使用することができます  awk 別のスクリプトを記述すること。次の例では、模倣体は以前に書き込まれただけでなく、システムアカウントの数を計算しました。

  1. #!/usr/bin/awk -f
  2. # 这一行是注释
  3. BEGIN {
  4. printf "%s\n","User accounts:"
  5. print "=============="
  6. FS=":"
  7. n=0
  8. }
  9. # 现在开始遍历数据
  10. {
  11. if ($3 >= 1000) {
  12. print $1
  13. n ++
  14. }
  15. }
  16. END {
  17. print "=============="
  18. print n " accounts"
  19. }

注  BEGIN セクションでは、フィールドセパレータを指定して、タイトルを提供することであり、カウンタが初期化され、それが唯一のスクリプトの初期化期間に行われますか。スクリプトも含まれている  END 中間コマンドの処理が完了し、すべての後にのみ実行セクションを、全てのフィルタデータの中間セクションの行の最後の数(第3のフィールド1000以上)。

永遠のUnixコマンドの上として、awk まだ私はUnixのの数十年前と恋に落ちた理由の一つである非常に便利なサービスを、提供しています。


経由:  https://www.networkworld.com/article/3454979/the-many-faces-of-awk.html

著者:サンドラヘンリー・ストッカーの  トピック:lujun9972の  翻訳:LuuMing  校正:WXY

この記事  LCTT  オリジナルのコンパイラは、Linuxの中国は  誇りに思っています

おすすめ

転載: www.cnblogs.com/jinanxiaolaohu/p/12083449.html