Awk変数、数式、代入演算子の使用方法を学ぶ-パート8


Awkコマンドシリーズはエキサイティングになっています。前の7つのパートでは、Linuxで基本的なテキストまたは文字列のフィルタリングを実行できるようにするために習得する必要のあるAwkの基本について説明しました。

このパートから始めて、より複雑なテキストまたは文字列のフィルタリング操作を処理するために、Awkの高度な領域に飛び込みます。したがって、変数、数式、代入演算子などのAwkの機能について説明します。

これらの概念は、シェル、C、Pythonなどの多くのプログラミング言語の前におそらく遭遇した可能性のある概念と包括的に区別されないため、このトピックについてあまり心配する必要はありません。これらの言及された機能。

これはおそらく最も理解しやすいAwkコマンドセクションの1つになるので、座って始めましょう。

1.Awk変数

どのプログラミング言語でも、変数は値を格納するプレースホルダーです。プログラムファイルに変数を作成すると、ファイルが実行されるときに、変数に指定した値を格納するスペースがメモリに作成されます。

次のようにシェル変数を定義するのと同じ方法で、Awk変数を定義できます。

variable_name=value 

上記の構文では:

  1. variable_name: is the name you give a variable
  2. value: the value stored in the variable

以下のいくつかの例を見てみましょう。

computer_name=”tecmint.com”
port_no=”22”
email=”[email protected]”
server=”computer_name”

上記の簡単な例を見てください。最初の変数定義では、値 tecmint.com が変数 computer_name に割り当てられています。

さらに、値 22 が変数 port_no に割り当てられます。値を割り当てた最後の例のように、ある変数の値を別の変数に割り当てることもできます。 computer_name を変数サーバーに追加します。

思い出してください。このAwkシリーズのパート2でフィールド編集について説明しましたが、Awkが入力行をフィールドに分割し、標準のフィールドアクセス演算子 $ を使用してさまざまなフィールドを読み取る方法について説明しました。解析されました。次のように、変数を使用してフィールドの値を格納することもできます。

first_name=$2
second_name=$3

上記の例では、 first_name の値が2番目のフィールドに設定され、 second_name が3番目のフィールドに設定されています。

例として、 names.txt という名前のファイルを考えてみます。このファイルには、アプリケーションのユーザーの名前と名前、および性別を示すリストが含まれています。 catコマンドを使用すると、ファイルの内容を次のように表示できます。

$ cat names.txt

次に、変数 first_name second_name を使用して、以下のAwkコマンドを実行するように、リストの最初のユーザーの名前と名前を格納することもできます。

$ awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt

別のケースも見てみましょう。ターミナルでコマンド uname -a を発行すると、すべてのシステム情報が出力されます。

2番目のフィールドには hostname が含まれているため、ホスト名を hostname という変数に格納し、次のようにAwkを使用して出力できます。

$ uname -a
$ uname -a | awk '{hostname=$2 ; print hostname ; }' 

2.数式

Awkでは、数式は次の数値演算子を使用して作成されます。

  1. * : multiplication operator
  2. + : addition operator
  3. / : division operator
  4. - : subtraction operator
  5. % : modulus operator
  6. ^ : exponentiation operator

数式の構文は次のとおりです。

$ operand1 operator operand2

上記の形式では、 operator1 operand2 は数値または変数名にすることができ、 operator は上記の演算子のいずれかです。

以下は、数式を作成する方法を示すいくつかの例です。

counter=0
num1=5
num2=10
num3=num2-num1
counter=counter+1

Awkでの数式の使用を理解するために、以下の例を検討します。ファイル domains.txt には、Tecmintが所有するすべてのドメインが含まれています。

news.tecmint.com
tecmint.com
linuxsay.com
windows.tecmint.com
tecmint.com
news.tecmint.com
tecmint.com
linuxsay.com
tecmint.com
news.tecmint.com
tecmint.com
linuxsay.com
windows.tecmint.com
tecmint.com

ファイルの内容を表示するには、次のコマンドを使用します。

$ cat domains.txt

ドメイン tecmint.com がファイルに表示される回数をカウントする場合は、次のように簡単なスクリプトを記述できます。

#!/bin/bash
for file in [email protected]; do
        if [ -f $file ] ; then
                #print out filename
                echo "File is: $file"
                #print a number incrementally for every line containing tecmint.com 
                awk  '/^tecmint.com/ { counter=counter+1 ; printf "%s\n", counter ; }'   $file
        else
                #print error info incase input is not a file
                echo "$file is not a file, please specify a file." >&2 && exit 1
        fi
done
#terminate script with exit code 0 in case of successful execution 
exit 0

スクリプトを作成し、保存して実行可能にします。ファイル domains.txt を入力として実行すると、次の出力が得られます。

$ ./script.sh  ~/domains.txt

スクリプトの出力から、ファイル domains.txt tecmint.com を含む6行があり、手動でカウントできることを確認しています。

3.代入演算子

ここで取り上げる最後のAwk機能は代入演算子です。Awkにはいくつかの代入演算子があり、これらには次のものが含まれます。

  1. *= : multiplication assignment operator
  2. += : addition assignment operator
  3. /= : division assignment operator
  4. -= : subtraction assignment operator
  5. %= : modulus assignment operator
  6. ^= : exponentiation assignment operator

Awkでの代入演算の最も単純な構文は次のとおりです。

$ variable_name=variable_name operator operand

例:

counter=0
counter=counter+1

num=20
num=num-1

上記の代入演算子を使用して、Awkでの代入演算を短縮できます。前の例を検討すると、次の形式で代入を実行できます。

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

したがって、 + u003d 代入演算子を使用して、上記で記述したシェルスクリプトのAwkコマンドを次のように変更できます。

#!/bin/bash
for file in [email protected]; do
        if [ -f $file ] ; then
                #print out filename
                echo "File is: $file"
                #print a number incrementally for every line containing tecmint.com 
                awk  '/^tecmint.com/ { counter+=1 ; printf  "%s\n",  counter ; }'   $file
        else
                #print error info incase input is not a file
                echo "$file is not a file, please specify a file." >&2 && exit 1
        fi
done
#terminate script with exit code 0 in case of successful execution 
exit 0

Awkシリーズのこのセグメントでは、変数、数式の作成、代入演算子の使用など、いくつかの強力なAwk機能に加えて、実際にそれらを使用する方法のいくつかの図を取り上げました。

これらの概念は他のプログラミング言語の概念と何ら変わりはありませんが、Awkプログラミングではいくつかの重要な違いがあるかもしれません。

パート9では、特別なパターンである BEGIN END というAwkの機能について詳しく見ていきます。それまでは、Tecmintとの接続を維持してください。