記事ディレクトリ
1.オーク
Awk の仕組み:
デフォルトで区切り文字としてスペースまたはタブキーで区切られたテキストを行ごとに読み取り、区切られたフィールドを組み込み変数に保存し、モードまたは条件に従って編集コマンドを実行します。
sed コマンドは行全体を処理するためによく使用されますが、awk は行を複数の「フィールド」に分割して処理する傾向があります。awk情報の読み込みも一行ずつ読み込み、print dayの機能により実行結果を印刷表示することができます。awk コマンドを使用する過程で、論理演算子を使用し"&&"表示"与"、"| |"表示"或"、"!"表示"非"
、単純な数学演算を実行できます。
awk コマンドの形式:
awk 选项 '模式或条件 [操作]' 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 ...
Awk の一般的な組み込み変数 (直接使用可能) は次のとおりです。
キャラクター | 説明 |
---|---|
FS | 列区切り文字。テキストの各行のフィールド区切り文字を指定します。デフォルトはスペースまたはタブです。与"-F"作用相同 |
NF | 現在処理されている行のフィールド个数 |
NR | 現在処理中行的行号 (通常) |
$0 | 現在処理されている行の整行内容 |
$n | 現在処理されている第n个 行(列n)のフィールド |
ファイル名 | 処理中のファイル名 |
RS | 行区切り文字。awk がファイルからデータを読み取るとき、RS の定義に従ってデータを多数のレコードに分割し、処理のために一度に 1 つのレコードのみを読み取ります。デフォルト値は「\n」です |
2. awk はテキストを行ごとに出力します
1. すべてを出力します。
awk '{print}' shicao1.txt //输出所有内容
awk '{print $0}' shicao1.txt //输出所有内容
2. 4~6行目の内容を出力
awk 'NR==4,NR==6 {print $0}' shicao1.txt
3. 4~6行目の内容を出力(論理積)
awk 'NR>=4&&NR<=6 {print $0}' shicao1.txt
4. 4行目と6行目の内容を出力(論理和)
awk 'NR==4||NR==6{print}' shicao1.txt
5. すべての奇数/偶数行の内容を出力します。
awk '(NR%2)==1 {print $0}' shicao1.txt //输出所有奇数行的内容
awk '(NR%2)==0 {print $0}' shicao1.txt //输出所有偶数行的内容
5. 偶数行をすべて出力し、行番号を表示します。
awk '(NR%2)==0 {print NR,$0}' shicao1.txt
6. root で始まる行を出力します。
awk '/root/ {print $0}' /etc/passwd
7. 10行目の内容を表示しない
awk 'NR!=10{print $0}' shicao1.txt
8. 出力は bash で終わります。
awk '/bash$/ {print}' /etc/passwd
9. ファイルを処理する前。ファイルの処理によって実行される操作、END 操作
awk 'BEGIN {x=0}; /nologin$/ {x++;print x,$0}; END {print x}' /etc/passwd
3. Awk はフィールドごとにテキストを出力します
awk -F: '/^root/ {print $1}' /etc/passwd //各行の最初のフィールドを出力します(スペースまたはタブで区切られています)
awk -F: '/^root/ {print $3}' /etc/passwd //各行の 3 番目のフィールドを出力します (スペースまたはタブで区切られます)
awk -F: '/^root/ {print $1,$3}' /etc/passwd //各行の最初と 3 番目のフィールドの内容を出力します
awk -F: '/^root/ {print $1, 3 , 3,3 , NF}' /etc/passwd //各行の最初、3番目、最後のフィールドの内容を出力します
awk -F: '$3<5 {print $0}' /etc/passwd //値が 5 未満の 3 番目のフィールドの内容を出力します
awk -F: '$3<5 {print $3, $1}' /etc/passwd
awk -F: '!($3>10) {print $3,$1}' /etc/passwd //値が 5 未満の 3 番目のフィールドの内容を出力します
awk 'BEGIN {FS=":"};{if($3>=1000){print}}' /etc/passwd //まず BEGIN の内容を処理し、次にテキストの内容を出力します
awk -F ":" '{max=($3>=$4)?$3:$4;{print max}}' /etc/passwd //($3>$4)?$3:$4; 三項演算子、最初の If 3 つのフィールドの値が 4 番目のフィールドの値以上である場合、3 番目のフィールドの値を max に割り当て、それ以外の場合は 4 番目のフィールドの値を max に割り当てます。
awk -F ":" '{print NR,$0}' /etc/passwd //各行の内容と行番号を出力し、レコード処理後のNR値に1を加算します
awk -F ":" '$7~"/bash"{print $1}' /etc/passwd //コロンで区切られた行の最初のフィールドを出力し、7 番目のフィールドには /bash
awk -F ":" '($1 ~"root")&&(NF==7){print $1,$2}' /etc/passwd //ルートを含む行の 1 番目と 2 番目のフィールドと、1 番目のフィールドの 7 フィールドを出力
awk -F ":" ' ($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd //出力 7 番目のフィールドは / bin /bash ではなく、/ のすべての行でもありませんsbin/ノログイン
4. パイプラインと二重引用符を介してシェル コマンドを呼び出します。
awk '{print NR}' shicao1.txt // 行番号を出力
awk '{print NR,$0}' shicao1.txt
free -m | awk '/Mem:/ {print int($3/($3+$4)*100)“%”}’ // 現在のメモリ使用率を表示します
awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}' // w コマンドを呼び出し、それを使用してオンライン ユーザーの数をカウントします
CPU 使用率:
現在の CPU 使用率を確認します: top | awk '{print $0}' (動的)
1 回だけ実行します: top -b -n1
CPU 使用率を確認します:
top -b -n1 | awk '/%Cpu/ {print $8}'
top -b -n1 | awk -F, '/%Cpu/ {print $4}' | awk '{print $1}
top - b -n1 | awk -F, '/%Cpu/ {print $4}' | awk '{print 100-$1"%"}'
ルート ディレクトリの使用状況を表示します。
DF | awk '{print $5}'
DF | awk '$NF==“/”{print $5}'
cat /proc/uptime | awk -F, '{print $1}'
date -d "$(cat /proc/uptime | awk -F. '{print $1}') second ago" //开机时长
cat shicao2.txt | 並べ替え | uniq -c //統計
方法1:猫 shicao2.txt | awk '{a[$1]++}; END{for(i in a){print i,a[i]}} '
方法2:cat shicao2.txt | 並べ替え | ユニーク -c
エコー「ABCD」 | awk 'BEGIN{OFS=“,”}; {print $0}'
echo “ABCD” | awk 'BEGIN{OFS=“,”}; {$1=$1; $0 を印刷します}'$1=$1 は、$0 の再割り当て、つまりフィールド $1... の変更をアクティブにするために使用されます。フィールド数 NF は、awk に $0 の値を再計算するよう促します。これは通常、$0 のときに行われます。 OFS変更後に出力する必要がある
awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; print a[1]}'
awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; print a[0]}'
awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; print a[2]}'
awk 'BEGIN{a[“abc”]=10; a["def"]=20; a[“xyz”]=30; print a[“abc”]}
awk 'BEGIN{a[“abc”]=10; a["def"]=20; a[“xyz”]=30; print a[“xyz”]}'
awk 'BEGIN{a[“abc”]=10; a["def"]=20; a[“xyz”]=30; print a[“def”]}'
awk 'BEGIN{a[0]=1; a[1]=2; a[2]=3; for(i in a){print i,a[i]}}'PS1: BEGIN のコマンドは 1 回だけ実行されます
PS2: awk 配列の添字には数値または文字列を使用できますが、文字列には二重引用符を使用する必要があります
5. 概要:
awk 选项 '条件 {操作}'
awk -F '分隔符' 'NR==X {print $n}'
!= > >= < <= || &&
'/字符串或正则/ {....}'
'Sn~"字符串" {...]'
!~ == != > >= < <=
awk 'BEGIN{...}; 条件{...}; END{...}'
BEGIN{
...};处理文件前的操作
条件{
...};按照条件处理文件行内突的操作
END{
...} 处理完文件所有行内容后的操作