歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

linux-shell腳本命令:awk命令簡介

[ awk簡介: ]

awk可以從一個文本中獲取部分內容, 或者對這個文本進行排版, 使它按某種格式輸出.

[ awk工作流程: ]

awk會把文件一行內容去到內存裡, 然後對這行內容進行分段 ( 默認按空格或tab分割, $1, $2, $3... ). 再刪了, 然後讀取第二行內容到內存...

格式: awk '{/pattern/ command1; command2; ...}' file        # 匹配模式的這一行執行命令

例如: who | awk '{print $1}'    # 把分段的第一塊內容打印出來, $1為第一段,  $0為一行所有內容

[ awk參數說明: ]

-F re:允許awk更改其字段分隔符。

-v  定義變量, 從shell給awk傳遞變量, 如-vDATE=$DATE, 即將shell中$DATE變量值傳遞給awk變量DATE。

-f progfile:允許awk調用並執行progfile程序文件,當然progfile必須是一個符合awk語法的程序文件。

[ awk內置變量: ]

ARGC  命令行參數的個數

ARGV  命令行參數數組

ARGIND  當前被處理文件的ARGV標志符

awk '{if(ARGIND==1){print $1} if(ARGIND==2){print $2}}' aaa.txt bbb.txt  # 先掃描aaa文件, 再掃描bbb文件

NR  已經讀出的記錄數

awk 'NR==1,NR==5{print}' aaa.txt  # 顯示aaa.txt文件的 1 到 5 行

FNR  當前文件的記錄數

awk 'NR==FNR{print "a"} NR > FNR{print "b"}' a.txt b.txt

# 輸入文件a.txt和b.txt, 由於先掃描a.txt, 所以掃描a.txt的時候必然有NR==FNR;

# 然後掃描b.txt的時候, FNR從1開始計數, 而NR則接著a.txt的行數繼續計數, 所以NR > FNR

FS  輸入字段分隔符(缺省為:space:),相當於-F選項

awk -F ':' '{print $1}' ccc.txt  # 輸入文件以 : 作為分割符

OFS  輸出字段分隔符(缺省為:space:)

# 輸出時以 ; 分割

① cat ccc.txt  如下:

1:2:3

4:5:6

② awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' ccc.txt

③ 輸出結果如下:

1;2;3

4;5;6

NF  當前記錄中的分段個數

awk -F ':' '{print NF}' ccc.txt

RS  輸入記錄分隔符, 缺省為"\n", 缺省情況下, awk把一行看作一個記錄; 如果設置了RS, 那麼awk按照RS來分割記錄

① cat ccc.txt:       hello world; I want to go swimming tomorrow;hiahia

② 運行 awk 'BEGIN{ RS = ";" } {print}' ccc.txt

③ 結果如下:

 hello world

 I want to go swimming tomorrow

 hiahia

ORS  輸出記錄分隔符,缺省為換行符,控制每個print語句後的輸出符號

awk 'BEGIN{ FS="\n"; RS=""; ORS=";"} {print NF}' ddd.txt

[ awk內置函數: ]

blength[([s])]                計算字符串長度(byte為單位)

length[([s])]                  計算字符串長度(character為單位)

返回欄目頁:http://www.bianceng.cn/OS/Linux/

rand()                            生成隨機數

srand([expr])                設置rand() seed

int(x)                             字符串轉換為整型

substr(s, m [, n])           取子字符串

index(s, t)                     在字符串s中定位t字符串首次出現的位置

match(s, ere)                在字符串s中匹配正則ere,match修改RSTART、RLENGTH變量。

split(s, a[, fs])              將字符串分割到數組中

sub(ere, repl [, in])       字符串替換

gsub                              同上

sprintf(fmt, expr, ...)   拼字符串

system(cmd)                在shell中執行cmd。

toupper(s)                    字符串轉換為大寫

tolower(s)                    字符串轉換為小寫

[ awk用法示例: ]

1.  -F 表示以什麼作為分隔符

awk -F: '{print $1}' ccc.txt                     # 以 : 作為分隔符, 打印出ccc.txt文件中每一行中的第一段字符串

awk -F: '{print $1,$2}' ccc.txt               # 打印第一段和第二段字符串, 如果這樣寫$1 $2 那麼打印的內容會連在一起

2. /pattern/ 模式匹配

awk -F: '/A/{print $1}' ccc.txt               # 以 : 作為分隔符, 打印出ccc.txt文件中含有 A 的第一段字符串

3. ^ 表示以什麼開頭

awk -F: '/^A/{print $1}' ccc.txt             # 以 : 作為分隔符, 打印出ccc.txt文件中以 A 開頭的第一段字符串

4. ~ 表示匹配的意思

awk -F: '$4 ~ /A/{print $1}' ccc.txt      # 以 : 作為分隔符, 打印出ccc.txt文件中第四段中含有 A 的字符串

5. awk在把第一行讀入內存之前, 可以先做其他的一些操作, 使用BEGIN

格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...}' file

awk 'BEGIN{FS=":"}$1 ~ /A/{print $1}' ccc.txt   # 讀取ccc.txt文件之前, 首先執行BEGIN裡的命令, 設置 : 作為分割符

awk 'BEGIN{FS=":"; OFS="-"}$1 ~ /A/{print $1,$2}' ccc.txt # 輸出的分隔符以 - 進行隔開

6. awk在所有行處理完之後, 還可以先一些操作, 使用END

格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...} END{command}' file

7. 統計每一行分段後的段數用NF

who | awk '{print NF}'

8. 獲取awk處理文件內容在源文件中是第幾行用NR

awk -F: '/^A/{print NR}' ccc.txt          # 獲取以 A 開頭的串在ccc.txt是第幾行

9. 自定義變量

awk 'BEGIN{a=0}/tb/{a++} END{print a}' ccc.txt

# 循環ccc.txt文件之前, 先定義一個變量, 初始值為0; 然後循環每一行, 每找到一行含有tb的行就給 a 加 1, 直到最後打印 a 的值.

作者:csdn博客 zdp072

Copyright © Linux教程網 All Rights Reserved