AWK

### awk

awk分為nawk,gawk

我們shell中常用的awk 其版本是gawk

“`
AWK會把file中的每一行(記錄/可以指定分隔符),讀入空間中并默認以空白(TAB\space\\n)等分割成幾個字段,每個字段用$#表示$0表示整行本身
“`

awk [Option] ‘program’ file

option

-F:制定輸入時的字段分隔符

-v:var=VAR:自定義變量

program:Pattern{Action}

pattern:相當于地址定界

action:
一、print:輸出到終端(相當于s1hell中的echo)

print item1,item2

1)以逗號為分隔符
2)輸出的各item可以是字符串或數值:當前記錄的字段、變量或awk的表達式
(字符串要以雙引號引起來,如果$#被引起來那么輸出則是$#而不是$#轉換出來的變量值)
3)如果省略item,相當于print $0

示例:基本工作方式

“`
awk ‘{print $2″:”$4}’ /etc/fstab
/etc/fstab:
/data:defaults
/apache:defaults
/md1:defaults
/dev/shm:defaults
/dev/pts:gid=5,mode=620
/sys:defaults
/proc:defaults
[root@zhangxiao ~]#
“`

變量:變量需和-v一起使用
內建變量:
FS:默認輸入分隔符(列)
OFS:默認輸出分隔符(列)
RS:默認輸入分隔符(行)
ORS:默認輸出分隔符(行)

NF:字段數量
NR:行數量(也叫記錄數量)(從1..往后編)
FILENAME:當前處理的文件名(每一行顯示)

ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數

awk -v FS=: ‘{print $1}’ file
查找全文,每行按:為分隔符的列輸出$1到屏幕

自定義變量

1)-v VAR=VARLUE
變量名字區分大小寫
2)在program中直接定義

在{中引用變量(除了位置變量)不需要寫$符}

[root@zhangxiao ~]#awk -v A=”hello” ‘BEGIN{print A}’
hello
[root@zhangxiao ~]#

printf命令

printf FORMAT,item1,item2…
1)format必須給出
2)不會自動換行,如果需要顯示必須給出換行符\n
3)format中需要分別為后面的每一個item制定一個格式化符號

格式符
%c:顯示字符的ASCII碼
%d,%i:顯示十進制整數
%e.%E:科學計數法數值顯示
%f:顯示浮點數
%g,%G:以科學計數法或者浮點數形式顯示數值
%f:顯示字符串
%u:無符號整數
%%:顯示%自身

修飾符

#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度(不是小數可省略)
(默認為右對齊)
-:表示左對齊
+:顯示數值符號

操作符
算數運算操作符

+

*
/
^
%
-x(負號)

賦值

=
+=
-=
*=
/=
++

比較
>
<
=
!=
>=
<=
模式匹配符

~ :是否匹配
!~:是否不匹配

匹配后面的pattern要加在//中間

例 :awk ‘$3~/bash$/{print $3}

邏輯操作符

&&
||

函數調用
founction_name(argu1,argu2….)

條件表達式:

selector?if-ture-expression:if-false-expression:三目表達式 如果真執行前面的表達式如果失敗執行后面的表達式

PATTERN:

類似于地址定界
1):省略表示匹配每一行
2)/正則表達式/:僅處理能被此處的模式能匹配到的行
3)!//:對不匹配正則表達式匹配的行處理
4)關系型表達式:結果有真假(布爾值 ),結果為真的才處理
(結果非0或者非空時表示真。0和空字符串都表示假
6)//,//第一次匹配pattern1到第一次匹配pattern2
(此處不支持#,#的寫法如果要用需要用判斷如 wak -F: ‘(NR>=2&&NR<=10){print $1}

7)BEGIN/END模式:如果需要在文件處理之前或者之后執行一次的命令用這兩個模式BEGIN{CMD}

常用的action

1)EXPRESSIONS:表達式
2)控制語句 :if while等
3)組合語句 :
4)輸入語句
5)輸出語句

控制語句:if(condition){statments}
if(condition){statments} else {statments2}

while (condition){statments}
do {statments} while (condition)
for(expr1;expr2;expr3){statments}

break,continue
delete array[下標]
delete array
exit
{statments}

詳解控制語句

1) if(condition) statment {else statment}

示例:awk -v FS=: ‘{if($3>500) {print $3} else{print $1 ” is a user”}}’ /etc/passwd

使用場景,對awk取得的整行做條件判斷

2)while(condition) statment

條件為真時進入循環,為假是跳出循環

使用場景:對一行內的多個字段進行注意處理時用,或對數組中的數據進行注意處理時需要用

length():內建函數,統計字符個數

示例
awk -F: ‘/root/{i=1;while(i<=NF){print $i,length($i);i++}}’ /etc/passwd
統計帶有root的行每個單詞以及單詞的字符數

3)do-while循環

do statment while(condition)

至少執行一次循環體

4)for循環

for(expr1;expr2;expr3)statment

for(變量初始值;條件判斷;變量修正) 循環體

示例

awk -F: ‘/root/{for(i=1;i<=NF;i++){if(length($i)>7){print $i,length($i)}}}’ /etc/passwd

for循環可以遍歷數組中的每一個元素

語法
for (VAR in 數組名) 循環體

5)switch語句:

switch(expression){case VAR1 or /REGEXP/:statment;case VAR2 or /REGEXP/:statment2….default:statment}

6) continue和break

同shell
break [n]
continue

7) next :提前結束對本行的處理,直接進入下一行

8)數組

數組名[索引表達式]

索引表達式:
1)可以使用任意字符串
2)如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”

要判斷數組中是否存在此元素,使用index in array 格式 進行

如果我們想要顯示數組的元素值,直接調用不需要加$。

函數

內置函數

rand() :取隨機0-1之間小數(一次)

length(【s】):顯示字符串的長度

sub(r,s,[t]):用R表示的模式來查找t所表示的字符中匹配的內容,并將其第一次出現替換為s所表示的內容
gsub(r,s,[t]):全部替換

split(s,a,[r]):以r為分隔符 ,并將切割后的結果保存至a所表示的數組中

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99027

(0)
a.張笑a.張笑
上一篇 2018-05-20
下一篇 2018-05-20

相關推薦

  • Linux命令之date

    語法,選項,參數

    Linux筆記 2018-07-22
  • route命令

    1. ? 使用背景 ??????? 需要接入兩個網絡,一個是部署環境所在內網環境,這個環境是上不了外網, 外網環境很可能是一個無線網絡。如果兩者都連接上,很可能導致有一方不能起作用,即外網或內網上不了,常常需要使用繁瑣的“禁用網絡連接”、“啟用網絡連接”的操作來進行內外網的切換,甚是麻煩。 ??????? 為了解決這個問題,可以使用route命令來使得同時內…

    Linux筆記 2018-05-01
  • Linux文本處理三劍客之grep 和 正則表達式

    本文主要介紹:1、文本處理工具grep 2、正則表達式

    2018-04-17
  • Shell 腳本的進階

    if case

    2018-05-07
  • 軟、硬鏈接的對比分析

      硬鏈接與軟鏈接的對比分析 硬鏈接,即一個文件可以用同一個節點編號卻使用多個文件名。這數個文件名之間是平等的關系。 例:我在centos6.9的虛擬機上創建了一個文件f1(touch f1),然后以f1文件為舊文件建立一個名為f1.1的硬鏈接,再以文件f1.1創建一個名為f1.2的硬鏈接。接著我在f1文件中寫入內容,如下圖所示,三個文件中內容是一…

    2018-04-07
  • SElinux簡介

    本文主要介紹:SELinux概念、配置SELinux、管理文件安全標簽、管理端口標簽、管理SELinux布爾值開關、管理日志、查看SELinux幫助以及SElinux操作示例(遷移httpd服務默認目錄)

    2018-05-17
欧美性久久久久