シェルプログラミング3剣士awk
awkツールの紹介
Awkは、主にlinux / unixの下でテキストとデータを処理するために使用されるプログラミング言語であり、linux / unixの下のツールです。データは、標準入力、1つ以上のファイル、または他のコマンドの出力から取得できます。
Awkのテキストとデータの処理方法:ファイルを1行ずつ、デフォルトでは最初の行から最後の行までスキャンし、特定のパターンに一致する行を探して、これらの行に対して必要な操作を実行します。
Awkは、著者の姓の最初の文字を表します。その作者は、アルフレッド・アホ、ブライアン・カーニハン、ピーター・ウェインバーガーの3人です。
GawkはawkのGNUバージョンで、Bell LabsとGNUのいくつかの拡張機能を提供します。
以下に紹介するawkはGNUのgawkに基づいていますが、Linuxシステムではawkがgawkにリンクされているため、awkはすべて以下に紹介します。
awkツールの役割
1. awkは、ファイルとデータの処理に使用されます。これは、Unixライクなプログラミング言語のツールです。2。Web
サイトの訪問、IPの訪問などの統計に使用できます。3
。サポート条件の判断whileループのサポート
3つのawk構文フォーマット
awkオプション「コマンド部分」ファイル名
注意:
シェル変数を引用するには、二重引用符を使用して
一般的なオプションを導入します。-
Fはフィールド分離記号を定義し、デフォルトのセパレーターはスペースです
-vは変数を定義して値を割り当てます
3.1 awkの一般的に使用される内部変数
変数 | 変数の説明 | 備考 |
---|---|---|
$ 0 | 現在の処理ラインの全ライン | |
$ 1、$ 2、$ 3…$ n | 間隔記号で区切られたファイル内のさまざまなフィールド | awk -F: '{print $ 1、$ 3}' |
NF | 現在の処理ラインのフィールド数 | awk -F: '{print NF}' |
$ NF | 最後の行 | $(NF-1)は最後から2番目の列を意味します |
FNR / NR | 現在の処理ラインのライン番号 | |
FS | スペーサーを定義 | 'BEGIN {FS = ":"}; {print $ 1、$ 3}' |
OFS | デフォルトのスペースである出力フィールドセパレータを定義します | 'BEGIN {OFS = "\ t"}; $ 1、$ 3}を印刷する |
RS | レコードセパレータ、デフォルトの改行を入力してください | 'BEGIN {RS = "\ t"}; {print $ 0}' |
ORS | 出力レコードセパレータ、デフォルトの改行 | 'BEGIN {ORS = "\ n \ n"}; {print $ 1、$ 3}' |
3.2一般的に使用される内部変数の例
# awk -F: '{print $1,$(NF-1)}' 1.txt
# awk -F: '{print $1,$(NF-1),$NF,NF}' 1.txt
# awk '/root/{print $0}' 1.txt
# awk '/root/' 1.txt
# awk -F: '/root/{print $1,$NF}' 1.txt
root /bin/bash
# awk -F: '/root/{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
# awk 'NR==1,NR==5' 1.txt
# awk 'NR==1,NR==5{print $0}' 1.txt
# awk 'NR==1,NR==5;/^root/{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4つの高度なawkの使用
4.1 1.フォーマットされた出力printとprintf
print函数 类似echo "hello world"
# date |awk '{print "Month: "$2 "\nYear: "$NF}'
# awk -F: '{print "username is: " $1 "\t uid is: "$3}' /etc/passwd
printf函数 类似echo -n
# awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}' /etc/passwd
# awk -F: '{printf "|%15s| %10s| %15s|\n", $1,$2,$3}' /etc/passwd
# awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
awk 'BEGIN{FS=":"};{printf "%-15s %-15s %-15s\n",$1,$6,$NF}' a.txt
%s 字符类型 strings %-20s
%d 数值类型
占15字符
- 表示左对齐,默认是右对齐
printf默认不会在行尾自动换行,加\n
4.2 awk変数の定義
# awk -v NUM=3 -F: '{ print $NUM }' /etc/passwd
# awk -v NUM=3 -F: '{ print NUM }' /etc/passwd
# awk -v num=1 'BEGIN{print num}'
1
# awk -v num=1 'BEGIN{print $num}'
注意:
awk中调用定义的变量不需要加$