shell編程之awk


/***************************************************************************/
awk的內置變量


awk 'BEGIN{}pattern{command}END{}'

總結:內置變量
$0                    打印出行所有信息
awk '{print $0}' /etc/passwd

$1-$n                 打印行的第1到n個字段的信息
awk 'BEGIN{FS=":"}{print $1}' /etc/passwd

NF (Number Field)       處理行的字段個數
awk '{print NF}' list

NR (Number Row)         處理行的行號
awk '{print NR}' list /etc/passwd  后面指定的文件行數累加

FNR (File Number Row)   多文件處理時,每個文件單獨記錄行號
awk 'print FNR' list /etc/passwd

FS  (Filed Separator)   字段分割符,不指定時默認以空格或tab鍵做分割
awk 'BEGIN{FS="|"}{print $2}' list

RS                    行分割符,不指定時以回車換行分割
awk 'BEGIN{FS="|";RS="---"}{print $2}' list

OFS (Output Filed Separator)                  輸出字段分割符
awk 'BEGIN{RS="--";FS="|";ORS="&";OFS=":"}{print $1,$3}' list

ORS  (Output Row Separator)                 輸出行分隔符
awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $3}' list

FILENAME              處理文件的文件名
awk '{print FILENAME}' list

ARGC                  命令行參數的個數
awk '{print ARGC}' list

ARGV                  命令行參數數組



awk格式化輸出之printf總結
%s     打印字符串


%d     打印10進制數


%f     打印浮點數


%x     打印16進制數


%o     打印8進制數


%e     打印數字的科學計數法格式


%c     打印單個字符的ASCII碼



修飾符
-    左對齊
+    右對齊
#    顯示8進制在前面加0 顯示16進制在前面加0x


格式示例:

1、以字符串格式打印/etc/passwd中的第七個字段
awk 'BEGIN{FS=":"}{printf "%s",$7}' /etc/passwd

2、以10進制格式打印/etc/passwd中的第三個字段,以":"作為分隔符
awk 'BEGIN{FS=":"} {printf "%d\n",$3}' /etc/passwd

3、以浮點數格式打印/etc/passwd中的第三個字段,以":"作為分隔符
awk 'BEGIN{FS=":"} {printf "%f\n",$3}' /etc/passwd

4、以16進制數格式打印/etc/passwd中的第三個字段,以":"作為分隔符
awk 'BEGIN{FS=":"} {printf "%x\n",$3}' /etc/passwd

5、以8進制格式打印/etc/passwd中的第三個字段,以":"作為分隔符
awk 'BEGIN{FS=":"} {printf "%o\n",$3}' /etc/passwd

6、以科學計數法格式打印/etc/passwd中的第三個字段,以":"作為分隔符
awk 'BEGIN{FS=":"} {printf "%e\n",$3}' /etc/passwd


修飾符示例:
1左對齊格式
2右對齊格式
3打印8進制或者16進制是在前面加#


/********************************************************************************/
awk模式匹配用法總結:
①、RegExp
②、運算符匹配

1、RegExp
匹配/etc/passwd文件中含有root字符串的所有行
awk 'BRGIN{FS=":"}/root/{print $0}' /etc/passwd

匹配/etc/passwd文件行中以yarn開頭的所有行
awk 'BRGIN{FS=":"}/^yarn/{print $0}' /etc/passwd

2、運算符匹配

關系運算符匹配

<        小于
>        大于
<=       小于等于
>=       大于等于
==       等于
!=       不等于
~        匹配正則表達式


1、以:為分隔符,匹配/etc/passwd文件中第3個字段小于50的所有行信息
awk 'BEGIN{FS=":"}$3<50{print $0}' /etc/passwd

2、以:為分隔符,匹配/etc/passwd文件中第3個字段大于50的所有行信息
awk 'BEGIN{FS=":"}$3>50{print $0}' /etc/passwd

3、以:為分隔符,匹配/etc/passwd文件中第7個字段為/bin/bash的所有行信息
awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' /etc/passwd

4、以:為分隔符,匹配/etc/passwd文件中第7個字段不為/bin/bash的所有行信息
awk 'BEGIN{FS=":"}$7!="/bin/bash" /etc/passwd

5、以:為分隔符,匹配/etc/passwd文件中第3個字段包含3個以上數字的所有行信息
awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' /etc/passwd

布爾運算符匹配
||     或
&&     與
!     非

1:以:分隔符,匹配/etc/passwd文件中包含hdfs或者yarn的所有行信息
awk 'BEGIN{FS=":"}$1=="hdfs"||$1=="yarn"{print $0}' /etc/passwd

2:以:分隔符,匹配/etc/passwd文件中第三個字段小于50并且第四個字段大于50的所有行信息
awk 'BEGIN{FS=":"}$3<50 && $4>50{print $0}' /etc/passwd

awk的基本運算

+           加
-           減
*           乘
/           除
%           取模
^或**       乘方
++x         在返回x變量之前,x變量加1
x++         在返回x變量之后,x變量加1
--x         在返回x變量之前,x變量減1
x--         在返回x變量之后,x變量減1

1 使用awk計算/etc/services中空白的行數量


2 計算學生課程分數的平均值 學生課程文件如下


3 使用awk輸出/etc/passwd文件的行數 分兩種方式進行顯示行數 


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。