一、gawk 是什么
在了解gawk之前,先了解一下文本三工具
文本過濾工具:grep|egrep|fgrep 其中fgrep不支持正則表達式
1.行編輯器:sed sed 有兩種空間 模式空間 保持空間
2. 文本報告工具:awk|gawk 格式化文本輸出;他在處理文本文件時,對文檔中的數據有條件的輸出
3. gawk – pattern scanning and processing languageawk 本質上一個編程語言。 想要了解更詳細就 Google
現在先看看awk在系統上是?
原來awk是gawk,從上面看就知道/bin/awk是gawk的軟連接
二、awk的工作方式
1.awk 一次讀取一行文本 用輸入分隔符(默認為空格)進行切片。
awk使用一行作為輸入(通過文件或者管道),并將這一行賦給內部變量$0,默認時每一行也可以稱為一個記錄, 以換行符結束\n
$0 |
2.然后,行被空格分解成字段(單詞),每一個字段存儲在已經編號的變量中,$1開始。
$1 |
$2 |
$3 |
$4 |
……………… |
以上實例就可以說明awk 的工作方式,awk默認是空格作為分隔符的。在awk中無論多少空格都會當一個空格。
cat是無法理解多個空格的,準確的說是以固定的格式來識別的。 print后面會有說明。
三、awk的使用
1. 基本用法:gawk [options] 'program' FILE …..
program: PATTERN{ACTION STATEMENTS}
'program': gawk自己的編程語言
PATTERN: 模式
ACTION STATEMENTS:動作語句:語句有多個可以用分號(;)分隔
option:基礎常用的選項
-F:指明輸入時用到的字段分隔符;
-v var=value: 自定義變量;
輸出命令:在awk中總要輸出結果的。既然要輸出那就先了解一下簡單的輸出命令prin
2. print:
print item1, item2, …
從上述結果就可以看出print是逗號分隔。逗號是告訴print是多個字段的。
要點:
(1) 逗號分隔符;
(2) 輸出的各item可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式;
例:
其中的hello就是字符串,6就是數值,
(3) 如省略item,相當于print $0;
awk本質上是編程語言,那就他肯定也會有變量的。
3. 變量:每一個-v選項定義一個變量;變量分內建變量和自定義變量
常用的內建變量:
FS:input field seperator,默認為空白字符;輸入字段分隔符
OFS:output field seperator,默認為空白字符;輸出字段分隔符
例:
從上述例子可以看出,每一個-v定義一個變量,FS是輸入分隔符 ,OFS是輸出分隔符,
上述例子可以看出輸入的分隔符是: 輸出分隔符是—
RS:input record seperator,輸入時的換行符;行分隔符
ORS:output record seperator,輸出時的換行符;
對于awk命令而言,處理字段分隔符,還有行分隔符。行分隔符可以自己定義
例:
從上述例子就可以看出:就可以我把(:)定義為行分隔符了,輸入的是空格
NF:number of field,字段數量
例:
這個就不說了 :就是一一對應的看就行了
{print NF}, {print $NF} awk 中不需加$
如果加上$,就會引用最后段
NR:number of record, 行數; 顯示行數 對行統一技術
FNR:各文件分別計數;行數;
例:
從上述例子可以看出,NR是統計行數的,當多個文件時,他會統一的顯示所有的文件行數。
FILENAME:當前正在處理的文件名;
ARGC:命令行給定的參數的個數;
ARGV:數組,保存的是命令行所給定的各參數;awk也當做一個參數
自定義變量:
(1) -v var=value var是變量名 value:值
對于awk變量名也區分字 符大小寫;
(2) 在program中直接定義
格式化輸出命令printf
格式化輸出:printf FORMAT, item1, item2, …
要點:
(1) FORMAT必須給出;
(2) 不會自動換行,需要顯式給出換行控制符,\n
(3) FORMAT中需要分別為后面的每個item指定一個格式化符號;
格式符:
%c: 顯示字符的ASCII碼;
%d, %i: 顯示十進制整數;
%e, %E: 科學計數法數值顯示;
%f:顯示為浮點數;
%g, %G:以科學計數法或浮點形式顯示數值;
%s:顯示字符串;
%u:無符號整數;
%%: 顯示%自身;
例:
\n換行符,
這個其實就是$1輸出的格式符就是%s,$2就是%i的修飾符。
格式符中還有修飾符:
#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度;
%3.1f
-: 左對齊
+:顯示數值的符號
例:
這個可以直接看上面。
4、awk中的操作符
(1)算術操作符:
x+y, x-y, x*y, x/y x^y, x%y +:加 -:減:*乘:/除:^乘方:%:取余
-x:負數
+x: 轉換為數值;
(2)字符串操作符:沒有符號的操作符,字符串連接
賦值操作符:
=
+=
-=
*=
/=
%=
^=
++:自加
–:自減
(3)比較操作符:>, >=, <, <=, !=, ==
(4)模式匹配符:
~:是否匹配
!~:是否不匹配
(5)邏輯操作符:
&& 與
|| 或
! 非
(6)函數調用:
function_name(argu1, argu2, …)
(7)簡單條件表達式:
selector?if-true-expression:if-false-expression
selector 條件表達時
awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
對 $3>=1000 判斷是否系統用戶還是普通用戶。 usertype="Common User":usertype="Sysadmin or SysUser" 定義類型
printf "%15s:%-s\n",$1,usertype 輸出:如果大于1000輸出第一個也就是Common User,反之就第二個
5、PATTERN:模式
(1) empty:空模式,匹配文本的每一行;
之前用到的都是empty
(2) /regular expression/:僅處理能夠被此處的模式匹配到的行;
顯示./etc/fstab中的uuid的行
awk '/^UUID/{print $1}' /etc/fstab
取反
awk '!/^UUID/{print $1}' /etc/fstab
(3) relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;
真:結果為非0值,非空字符串;
判斷是系統用戶還普通用戶
awk ‘$3>=1000{print $1,$3},/etc/passwd
判斷shell是/bin/bash的用戶。
awk -F: '$NF=="/bin/bash"'{print $1,$NF}' /etc/passwd
(4) line ranges:行范圍,地址定界
startline,endline:/pat1/,/pat2/
注意: 不支持直接給出數字的格式
基于條件判斷的
~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
(5) BEGIN/END模式
BEGIN{}: 僅在開始處理文件中的文本之前執行一次;
END{}:僅在文本處理完成之后執行一次;
BEGIN{}只有執行一次的 END{}在結束時執行次
6、常用的action
(1) Expressions : 表達式
(2) Control statements:if, while等; 控制語句
(3) Compound statements:組合語句;
(4) input statements輸入語句
(5) output statements 輸出語句
好了這就是基礎了 ,方正就是多練就行了 ,可以man gawk
原創文章,作者:N19_king,如若轉載,請注明出處:http://www.www58058.com/20020