Shell腳本之awk文本編輯器語法(一)

AWK  ——是一種用於處理文本的編程語言工具。     英文原義:Aho、Weinberger、Kernighan     中文釋義:三位創造者Aho、Weinberger和Kernighan統稱      AWK 在不少方面相似於 shell 編程語言,儘管 AWK 具備徹底屬於其自己的語法。最初創造 AWK 時,其目的是用於文本處理,而且這種語言的基礎是,只要在輸入數據中有模式匹配,就執行一系列指令。該實用工具掃描文件中的每一行,查找與命令行中所給定內容相匹配的模式。若是發現匹配內容,則進行下一個編程步驟。若是找不到匹配內容,則繼續處理下一行。     awk 之因此成爲一種優秀的程序設計語言的緣由之一是內置函數的使用,awk定義並支持了一系列的內置函數,因爲這些函數的使用,使得awk提供的功能更爲完善和強大。 經常使用語法:     awk    [options]    'commands'        testfiles      options選項     -F    定義字段分隔符,默認分隔符爲連續空格或製表符         用$1,$2,$3等順序表示files中每行以間隔符號分隔的各列不一樣域     -v    定義變動並賦值,也能夠借用次方式從shell變量中引入變量 使用示例: [root@localhost test]# awk -F":" '{print $1,$7}' testfile         以冒號做爲分隔符,打印第1和第7個字段 [root@localhost test]# awk -F"[:/]" '{print $1,$7}' testfile         以冒號或斜槓 / 做爲分隔符,打印第1第7個字段 [root@localhost test]# awk -F":/" '{print $1,$7}' testfile         以冒號加斜槓 「:/」總體做爲分隔符         -----------------------------------------------------------    command     讀前處理    行處理        讀後處理         一、讀前處理    BEGIN{awk_cmd1;awk_cmd2;}         二、行處理:定址    命令         定址方法:正則,變量,比較,關係運算                 正則須要用 / / 包裹起來         經常使用正則:             ^    行首                $    行尾               .    除了換行符之外的任意單個字符               *    前導字符的零個或多個               .*    全部字符               []    字符組內的任一字符               [^]    對字符組內的每一個字符取反(不匹配字符組內的每一個字符)               ^[^]    非字符組內的字符開頭的行               [a-z] 小寫字母               [A-Z] 大寫字母               [a-Z] 小寫和大寫字母               [0-9] 數字               \<    單詞頭,以空格或特殊字符作分隔,連續的字符串被當作單詞               \>    單詞尾         擴展正則               ?         前導字符零個或一個               +         前導字符一個或多個               abc|def         abc或def               a(bc|de)f         abcf 或 adef               x\{m\}           x出現m次               x\{m,\}          x出現m次至屢次(至少m次)               x\{m,n\}         x出現m次至n次         NR變量定址,NR 表示AWK讀入的行數         FNR表示讀入行所在文件中的行數                   邏輯運算——可直接引用域進行運算             ==    >=    <=    !=    >    <    ~    !~             如:# awk 'NR==1 {print}'  /etc/passwd                     root:x:0:0:root:/root:/bin/bash                                     命令    如:{print $1,$2}             三、讀後處理         END {awk_cmd1;awk_cmd2;} --------------------------------------------------------------- AWk的變量     NR     AWK處理的總行數     FNR   AWK處理的當前文件的行數,非所有     FS     字段分隔符,默認爲連續空格或製表符,可使用多個不一樣的符號作分隔符,也可在options出使用  -F[:/]    指定分隔符     OFS   輸出字符的分隔符 默認是空格              如:# awk -F: 'OFS="***" {print $1,$2}' /etc/passwd                       root***x     NF     當前讀入行的字段個數     ORS   輸出行的分隔符,默認是換行         # awk -F: 'ORS="***" {print $1,$2}' /etc/passwd         root x***bin x***     FILENAME     當前文件名 --------------------------------------------------------------- 引用shell變量的方法: (1)使用 -v 引用變量值 [root@localhost test]# a=5 [root@localhost test]# awk -v c=$a  -F:  'NR < c {print NR,$0}' /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin   (2)把整個命令拆開傳遞,讓shell變量外露 [root@localhost test]# a=5 [root@localhost test]# awk -F: 'NR < '$a'{print NR,$0}' /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin ------------------------------------------------------------ 操做符     賦值        =         +=         -=         /=         *=     &&    ——邏輯與    ||——邏輯或     !——邏輯非               匹配正則或不匹配,正則須要用 /正則/ 包圍住         ~          !~     關係 比較字符串,要把字符串用雙引號引發來         <         <=     >     >=     !=         ==     字段引用         $     字段引用須要加$        而變量引用直接用變量名取     運算符         +     -     *     /     %         ++     --     轉義序列         \\         \自身         \$         轉義$         \t         製表符         \b         退格符         \r         回車符         \n         換行符         \c         取消換行 用法示例: # awk -F: '$3 >= 30 && $3 <= 40 {print $0}' /etc/passwd         打印出uid在30到40之間的用戶信息行 # awk -F: ' NR >= 30 && NR <= 40 {print NR,$0}' /etc/passwd         打印出行號在30到40之間的行 # awk -F: ' NR % 2 == 1 {print NR,$1,NF}' /etc/passwd         打印奇數行 # awk -F: ' NR % 2 == 0 {print NR,$1,NF}' /etc/passwd         打印偶數行 # awk -F: ' $3 != $4 {print NR,$1,$3,$4}' /etc/passwd         打印uid和gid不相等的用戶信息行 # awk -F: '$7 ~ /bash/ {print NR,$1,$7}' /etc/passwd         打印第7個字段能匹配 /bash/ 字符串的行 # awk -F: '$7 !~ /nologin/ {print NR,$1,$7}' /etc/passwd         打印第7個字段不能匹配 /nologin/ 字符串的行   ------------------------ 數組 自定義數組 # awk 'BEGIN{ary[1]="hunan";ary[2]="hubei";print ary[1],ary[2]}' hunan hubei # awk 'BEGIN{ary[1]="hunan";ary[2]="hubei";for(i in ary) print ary[i]}' hunan hubei 環產生數組和取出數組 # awk 'BEGIN{n=5;for (i=1;i<=n;i++) ary[i]=i+100;for(m in ary) print m,ary[m]}'     4 104     5 105     1 101     2 102     3 103 # awk -F: '{ary[NR]=$1}END{for(i in ary){print i,ary[i]}}' testfile 4 dbus 5 usbmuxd 6 hsqldb 7 avahi-autoipd 8 rpc 1 root 2 bin 3 myuser # awk -F: '{ary[$3]=$1} END {for(i in ary) print i,ary[i]}' testfile
相關文章
相關標籤/搜索