linux正則表現awk詳細
awkとsedは同じフローエディタで、ドキュメント内の行に対しても動作します。行と行の両方が実行されます。awkはsedよりもっと強くて、sedができます。同じようにsedができないこともできます。awkはしばしばセグメント化に用いられる。
awkはパラメータを加えずに+?*. | これらの特殊記号
1、ドキュメントの一部を切り取ります。
{}内では、複数のフィールド$1、$3、$7を印刷して、1、3、7番目のセクションを印刷します。中間はコンマで区切られます。
段落のデフォルトの区切り記号を印刷します。スペース記号をカスタマイズできます。区切り記号はダブルクォーテーションで囲む必要があります。OFS定義出力セパレータもよい。
2、マッチング文字または文字列
3、条件操作子
3番目のフィールドが0であると判断します。
[
例として、二重引用符は文字としてまとめられています。プラスの引用符とプラスしない場合は数字とする。
例として、二重引用符を付けた後、数字を文字として見ます。
例として、3段目は4段目より大きく、7段目は/bin/bash行である。
awkでよく使われる変数は、
NF:セパレータで区切って、全部でいくつの段がありますか?
NR:行数
{print NR':'NF} 行番号を並べて、コロンで区切って、全部でいくつの段がありますか?
5、awkでの数学演算
awkはまた、各セグメントの値を数学的に演算することができる。
例として、if判定は、第一段の値がrootであるように、行全体を印刷する。
awkはパラメータを加えずに+?*. | これらの特殊記号
1、ドキュメントの一部を切り取ります。
[root@yonglinux ~]# head -n2 passwd |awk -F: '{print $1}'
root
bin
[root@yonglinux ~]# head -n2 passwd |awk -F: '{print $0}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@yonglinux ~]# head -n2 passwd |awk -F: '{print $1,$3,$7}'
root 0 /bin/bash
bin 1 /sbin/nologin
-Fオプションの役割は、区切り記号を指定します。-Fで指定しない場合は、スペースまたはtabで区切ります。Printは印刷の動作で、あるフィールドを印刷するために使用されます。1は最初のフィールドです。$2は第二のフィールドです。順に類推します。特殊なのは$0で、行全体を表しています。{}内では、複数のフィールド$1、$3、$7を印刷して、1、3、7番目のセクションを印刷します。中間はコンマで区切られます。
段落のデフォルトの区切り記号を印刷します。スペース記号をカスタマイズできます。区切り記号はダブルクォーテーションで囲む必要があります。OFS定義出力セパレータもよい。
[root@localhost ~]# awk -F: '{print $3,$4}' 1.txt |head -5
0 0
1 1
2 2
3 4
4 7
[root@localhost ~]# awk -F: '{print $3":"$4}' 1.txt |head -5
0:0
1:1
2:2
3:4
4:7
[root@localhost ~]# awk -F: 'OFS="#"{print $3,$4}' 1.txt |head -5
0#0
1#1
2#2
3#4
4#7
[root@yonglinux ~]# head -n2 passwd |awk -F: '{print $1"#""@"$3"#"$7}'
root#@0#/bin/bash
bin#@1#/sbin/nologin
awkのフォーマットに注意してください。-Fの後はシングル引用符に続き、中はセパレータです。printの動作は{}でくくります。そうでないとエラーが発生します。printはカスタムコンテンツを印刷することもできますが、ユーザー定義の内容はダブルクォーテーションで囲んでください。2、マッチング文字または文字列
[root@yonglinux ~]# awk -F: '$1~/me/' passwd
games:x:12:100:games:/usr/games:/sbin/nologin
[root@yonglinux ~]# awk -F: '$1~/user/' passwd
user1:x:600:501::/home/user1:/bin/bash
ある段落をマッチさせることができます。マッチする意味を表して、第一のフィールドをコロンで区切ってキーワードにマッチします。
[root@yonglinux ~]# awk -F: '/root/ {print $1,$3} /user/ {print $1,$3}' passwd
root 0
operator 11
ftp 14
saslauth 499
user1 600
awkはまた、上記の例のように、全文がrootキーワードを含む行にマッチし、userを含む行にマッチし、第1、第3段が印刷されます。3、条件操作子
3番目のフィールドが0であると判断します。
[
root@yonglinux ~]# awk -F: '$3=="0"' passwd
root:x:0:0:root:/root:/bin/bash
[root@yonglinux ~]# awk -F: '$3==10' passwd
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
3番目のフィールドが10であると判断し、行の7番目のフィールドを印刷します。
[root@yonglinux ~]# awk -F: '$3==10 {print $7}' passwd
/sbin/nologin
[root@yonglinux ~]# awk -F: '$3=="600"' passwd
user1:x:600:501::/home/user1:/bin/bash
awkでは論理記号で判断できます。例えば「=」はイコールであり、「正確にマッチする」とも解釈できます。など、数字と比較する場合、比較した数字をダブルクォーテーションで引き起こした場合、awkは数字とはみなされず、文字として認識されず、ダブルクォーテーションを加えないと数字として認識されることが注目されます。例として、二重引用符は文字としてまとめられています。プラスの引用符とプラスしない場合は数字とする。
[root@yonglinux ~]# awk -F: '$3>"500"' passwd | sort -t: -k 3 -n
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
sshd:x:74:74:privilege-separated ssh:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:system message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:nobody:/:/sbin/nologin
user1:x:600:501::/home/user1:/bin/bash
[root@yonglinux ~]# awk -F: '$3>500' passwd | sort -t: -k 3 -n
user1:x:600:501::/home/user1:/bin/bash
[root@yonglinux ~]# awk -F: '$3>'500'' passwd | sort -t: -k 3 -n
user1:x:600:501::/home/user1:/bin/bash
!=不一致のために、7番目のフィールドは/sbin/nolognの行に等しくないので、ダブルクォーテーションで囲む必要があります。
[root@yonglinux ~]# awk -F: '$7!="/sbin/nologin"' passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
user1:x:600:501::/home/user1:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
あるセグメントの文字を論理的に比較する以外に、2つのセグメント間で論理的に比較することができます。例として、二重引用符を付けた後、数字を文字として見ます。
[root@yonglinux ~]# awk -F: '$3>"5" && $3<"7"' passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
user1:x:600:501::/home/user1:/bin/bash
例として、引用符を付けた後の数字の比較。
[root@yong ~]# awk -F: '$3>'5' && $3<'7' {print }' passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
また、&&"と"を使用することもできます。 || “あるいは」という意味です。例として、3段目は4段目より大きく、7段目は/bin/bash行である。
[root@yonglinux ~]# awk -F: '$3>$4 && $7=="/bin/bash"' passwd
user1:x:600:501::/home/user1:/bin/bash
例として、3段目が4段目より小さい、または7段目が/bin/bashの行を印刷する。
[root@yonglinux ~]# awk -F: '$3<$4 || $7=="/bin/bash"' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:ftp user:/var/ftp:/sbin/nologin
user1:x:600:501::/home/user1:/bin/bash
mysql:x:27:27:mysql server:/var/lib/mysql:/bin/bash
4、awkの内蔵変数awkでよく使われる変数は、
NF:セパレータで区切って、全部でいくつの段がありますか?
NR:行数
{print NR':'NF} 行番号を並べて、コロンで区切って、全部でいくつの段がありますか?
[root@yonglinux ~]# head -5 passwd |awk -F: '{print NR":"NF}'
1:7
2:7
3:7
4:7
5:7
[root@yonglinux ~]# head -5 passwd |awk -F: '{print NF}'
7
7
7
7
7
[root@yonglinux ~]# head -5 passwd |awk -F: '{print NR}'
1
2
3
4
5
[root@yonglinux ~]# head -5 passwd |awk -F: '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
NFはいくつの段を表していますか?一方、NFは最後の段の値です。NRは行番号です。5、awkでの数学演算
awkはまた、各セグメントの値を数学的に演算することができる。
[root@yonglinux ~]# awk -F: '{(tot=tot+$3)};END {print tot};' passwd
1720
ここのENDは注意してください。すべての行が既に実行されていることを表しています。これはawk特有の文法です。awkはsedと一緒にスクリプトファイルを作成できます。また、独自の文法があります。awkでif判断、forサイクルを使ってもいいです。例として、if判定は、第一段の値がrootであるように、行全体を印刷する。
[root@yonglinux ~]# awk -F: '{if ($1=="root") print $0}' passwd
root:x:0:0:root:/root:/bin/bash
例として、forループは、sum変数、i値は第3段の値を定義します。第3段の和を求めます
[root@yonglinux ~]# sum=0;for i in `awk -F: '{print $3}' passwd`;do sum=$[($sum+$i)];done;echo $sum
1720
以上はlinux正則表現awkの内容についてです。皆さんの勉強に役に立ちたいです。