【shell筆記>命令】grep,sed,awk

grep

grep的基本用法

grep命令是支持正則表達(dá)式的一個多用途文本搜索工具脆烟,一般格式為

grep 選項 模式 文件

選項 意義
-c 只輸出匹配行的數(shù)量
-i 搜索時忽略大小寫
-h 查詢多文件時不顯示文件名
-l 只列出符合匹配的文件名,而不列出具體的匹配行
-n 列出所有的匹配行房待,并顯示行號
-s 不顯示不存在或無匹配文本的錯誤信息
-v 顯示不包含匹配文本的所有行
-w 匹配整詞
-x 匹配正行
-r 遞歸搜索邢羔,不僅搜索當(dāng)前目錄,而且搜索子目錄
-q 禁止輸出任何結(jié)果桑孩,以退出狀態(tài)表示搜索是否成功
-b 打印匹配行距文件頭部的偏移量拜鹤,以字節(jié)為單位
-o 與-b選項結(jié)合使用,打印匹配的詞距文件頭部的偏移量流椒,以字節(jié)為單位
-E 支持?jǐn)U展的正則表達(dá)式
-F 不支持正則表達(dá)式敏簿,按照字符串的字面意思進行匹配

grep命令的模式十分靈活,可以是字符串,也可以是變量惯裕,還可以是正則表達(dá)式温数。注意,無論模式是何種形式轻猖,只要模式中包含空格帆吻,就需要使用雙引號將模式引起來。

grep與正則表達(dá)式

  1. 匹配行首咙边,用元字符^
  1. 設(shè)置大小寫猜煮,用-i

  2. 匹配重復(fù)字符,用., *

  3. 轉(zhuǎn)義符败许,用\

  4. POSIX字符類

    類名 意義
    [:upper:] 表示大寫字母[A~Z]
    [:lower:] 表示小寫字母[a~z]
    [:digit:] 表示阿拉伯?dāng)?shù)字[0~9]
    [:alnum:] 表示大小寫字母和阿拉伯?dāng)?shù)字
    [:space:] 表示空格鍵和TAB鍵
    [:alpha:] 表示大小寫字母
    [:cntrl:] 表示Ctrl
    [:graph:]或[:print:] 表示ASCII碼
    [:xdigit:] 表示16進制數(shù)字[09AFa~f]
  5. 精確匹配:用\<\>

  6. 或字符王带,grep需要加上-E選項才能支持它,用|表示

grep命令族

grep: 標(biāo)準(zhǔn)grep命令

egrep: 擴展grep命令,支持基本和拓展正則表達(dá)式

fgrep: 快速grep命令市殷,不支持正則表達(dá)式


sed命令

sed是一個非交互式文本編輯器愕撰,它可對文本文件和標(biāo)準(zhǔn)輸入進行編輯,標(biāo)準(zhǔn)輸入可以是來自鍵盤輸入醋寝、文件重定向搞挣、字符串、變量音羞,甚至來自管道的文本囱桨。sed適用于以下三中場合:

  • 編輯相對交互式文本編輯器而言太大的文件。
  • 編輯命令太復(fù)雜嗅绰,在交互式文本編輯器中難以輸入的情況舍肠。
  • 對文件掃描一遍,但是需要執(zhí)行多個編輯函數(shù)的情況窘面。

基本用法

sed只是對緩沖區(qū)中原始文件的副本進行編輯翠语,并不編輯原始文件。如果需要保存文件改動的內(nèi)容财边,需要將輸出重定向到另一個文件肌括。

調(diào)用sed有三種方式,一種為Shell命令行方式酣难,另外兩種是將sed命令寫入腳本文件们童,然后執(zhí)行該腳本文件。

  1. 在Shell命令行輸入命令調(diào)用sed鲸鹦,格式為sed [選項] 'sed命令' 輸入文件慧库。
  2. sed命令插入腳本文件后,然后通過sed命令調(diào)用它馋嗜,格式為sed [選項] -f sed 腳本文件 輸入文件齐板。
  3. sed命令插入腳本文件后,最常用的方法是設(shè)置該腳本文件為可以執(zhí)行,然后直接執(zhí)行該腳本文件甘磨,格式為./sed腳本文件 輸入文件

第三種方式腳本文件需要以sha-bang(#!)符號開頭橡羞。無論哪種方式,如果沒有指定輸入文件济舆,sed將從標(biāo)準(zhǔn)輸入接收輸入卿泽。常用選項有三個

選項 意義
-n 不打印所有的行到標(biāo)準(zhǔn)輸出
-e 表示將下一個字符串解析為sed編輯命令,如果只傳遞一個滋觉,可以省略
-f 表示正在調(diào)用sed腳本文件

sed命令主要由定位文本行和sed編輯命令兩部分組成签夭,有兩種方式定位文本:

  • 使用行號,指定一行椎侠,或者指定行號范圍
  • 用正則表達(dá)式
選項 意義
x x為指定行號
x,y 指定從x到y(tǒng)的行號范圍
/pattern/ 查詢包含模式的行
/pattern/pattern/ 查詢包含兩個模式的行
/pattern/,x 從pattern匹配行到x號行
x,/pattern/ 上一條反過來
x,y! 查詢不包括x和y行號的行

編輯命令

選項 意義
p 打印匹配行
= 打印文件行號
a\ 在定位行號后追加文本信息
i\ 在定位行號之前插入文本信息
d 刪除定位行
c\ 用新文本替代定位文本
s 使用替換模式替換相應(yīng)模式
r 從另一個文件中讀文本
w 將文本寫入到一個文件
y 變換字符
q 第一個模式匹配后退出
l 顯示與八進制ASCII碼等價的控制字符
{} 在定位行執(zhí)行的命令組
n 讀取下一個輸入行第租,用下一個命令處理新的行
h 將模式緩沖區(qū)的文本復(fù)制到保持緩沖區(qū)
H ...追加到保持緩沖區(qū)
x 互換模式緩沖區(qū)和保持緩沖區(qū)內(nèi)容
g 將保持模式緩沖區(qū)的內(nèi)容復(fù)制到模式緩沖區(qū)
G ....追加到模式緩沖區(qū)

示例

測試文件內(nèi)容:

    This is a Certificate Request file:

    It should be mailed to zawu@seu.edu.cn

    =====================================================
    Certificate Subject:

    /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus

    The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
    To install this user certificate, please save this e-mail message into the following file.

    /home/alloy/linuxshell/CH02/usercert.pem

sed -n: 不打印sed編輯對象的全部內(nèi)容

wsx@wsx-ubuntu:~/桌面$ sed -n '1p' input
    This is a Certificate Request file:

wsx@wsx-ubuntu:~/桌面$ sed '1p' input
    This is a Certificate Request file:
    This is a Certificate Request file:

    It should be mailed to zawu@seu.edu.cn

    =====================================================
    Certificate Subject:

    /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus

    The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
    To install this user certificate, please save this e-mail message into the following file.

    /home/alloy/linuxshell/CH02/usercert.pem

利用sed命令打印范圍行:

wsx@wsx-ubuntu:~/桌面$ sed -n '3,6p' input 
    It should be mailed to zawu@seu.edu.cn

    =====================================================
    Certificate Subject:

sed -e: sed傳遞多個編輯命令時使用

wsx@wsx-ubuntu:~/桌面$ sed -n '/Certificate/=' input 
1
6

wsx@wsx-ubuntu:~/桌面$ sed -n -e '/Certificate/p' input  -e '/Certificate/=' input
    This is a Certificate Request file:
1
    Certificate Subject:
6


sed -f:調(diào)用sed腳本文件時才起作用

wsx@wsx-ubuntu:~/桌面$ sed '/file:/a\We append a new line.' input 
    This is a Certificate Request file:
We append a new line.

    It should be mailed to zawu@seu.edu.cn

    =====================================================
    Certificate Subject:

    /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus

    The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
    To install this user certificate, please save this e-mail message into the following file.

    /home/alloy/linuxshell/CH02/usercert.pem

腳本用法:

#! /bin/sed -f 
/file:/a\       #a\表示在此處添加文本

# 添加文本
We append a new line.\
We append a another line.

sed基本編輯命令可以放在單引號內(nèi),也可放在單引號外我纪。

sed文本定位的一組例子

  1. 匹配元字符慎宾,用轉(zhuǎn)義符\進行屏蔽

    wsx@wsx-ubuntu:~/桌面$ sed -n '/\./p' input 
     It should be mailed to zawu@seu.edu.cn
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
     /home/alloy/linuxshell/CH02/usercert.pem
    
    
  2. 使用元字符進行匹配

    $在sed命令中表示最后一行

    wsx@wsx-ubuntu:~/桌面$ sed -n '$p' input
     /home/alloy/linuxshell/CH02/usercert.pem
    
  3. !符號,打印不在2-10的行

    wsx@wsx-ubuntu:~/桌面$ sed -n '2,10!p' input 
     This is a Certificate Request file:
     To install this user certificate, please save this e-mail message into the following file.
    
     /home/alloy/linuxshell/CH02/usercert.pem
    
  4. 使用行號和關(guān)鍵字匹配限定行范圍

    wsx@wsx-ubuntu:~/桌面$ sed -n '/seugrid/,$p' input 
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
    
     /home/alloy/linuxshell/CH02/usercert.pem
    

sed基本編輯命令的一組例子

  1. 插入文本:運行腳本浅悉,以輸入文件名作為參數(shù)

    #!/bin/sed -f
    /file:/i\             # i\表示此處換行插入文本
    We insert a new line.
    
  2. 修改文本

    #!/bin/sed -f
    
    /file:/c\             #c\表示此處換行修改文本
    We modify this line      #修改文本內(nèi)容
    
  3. 刪除文本趟据,符號是d,不帶\术健,與其他命令有所區(qū)別汹碱,非常靈活。下面刪除第一行和最后一行苛坚。

    wsx@wsx-ubuntu:~/桌面$ sed '1d' input
    
     It should be mailed to zawu@seu.edu.cn
    
     =====================================================
     Certificate Subject:
    
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
    
     /home/alloy/linuxshell/CH02/usercert.pem
    wsx@wsx-ubuntu:~/桌面$ sed '$d' input
     This is a Certificate Request file:
    
     It should be mailed to zawu@seu.edu.cn
    
     =====================================================
     Certificate Subject:
    
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
    
    
  4. 替換文本比被,格式s/被替換的字符串/新字符串/[替換選項]

    選項 意義
    g 全局匹配替換(替換所有的)
    p 與-n選項結(jié)合色难,只打印替換行
    w 文件名 表示將輸出定向到一個文件
    sx@wsx-ubuntu:~/桌面$ sed 's/Certificate/CERTIFICATE/' input
     This is a CERTIFICATE Request file:
    
     It should be mailed to zawu@seu.edu.cn
    
     =====================================================
     CERTIFICATE Subject:
    
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
    
     /home/alloy/linuxshell/CH02/usercert.pem
    wsx@wsx-ubuntu:~/桌面$ sed -n 's/Certificate/CERTIFICATE/p' input
     This is a CERTIFICATE Request file:
     CERTIFICATE Subject:
    
  5. 寫入到一個新文件

    wsx@wsx-ubuntu:~/桌面$ sed -n 's/Certificate/CERTIFICATE/pg' input
     This is a CERTIFICATE Request file:
     CERTIFICATE Subject:
    wsx@wsx-ubuntu:~/桌面$ 
    wsx@wsx-ubuntu:~/桌面$ sed -n '1,5 w output' input
    wsx@wsx-ubuntu:~/桌面$ cat output 
     This is a Certificate Request file:
    
     It should be mailed to zawu@seu.edu.cn
    
     =====================================================
    
    
  6. 從文件中可讀入文本泼舱,格式指定地址 r 文件名

  7. 退出命令:q

  8. 變換命令:sed命令的y表示字符變換(不等長時會報錯)

    wsx@wsx-ubuntu:~/桌面$ sed 'y/fmj/FMJ/' input 
     This is a CertiFicate Request File:
    
     It should be Mailed to zawu@seu.edu.cn
    
     =====================================================
     CertiFicate SubJect:
    
     /O=Grid/OU=GlobusTest/OU=siMpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certiFicate subJect, and t uniquely identiFies theis user. $88
     To install this user certiFicate, please save this e-Mail Message into the Following File.
    
     /hoMe/alloy/linuxshell/CH02/usercert.peM
    
    
  9. 顯示控制字符:控制字符就是非打印字符枷莉,如退格鍵娇昙、F1鍵等。使用sed l命令笤妙。

  10. 在命令行執(zhí)行命令組冒掌,用{}符號,與-e選項功能類似蹲盘。

    wsx@wsx-ubuntu:~/桌面$ sed -n '/Certificate/{p;=}' input
        This is a Certificate Request file:
    1
        Certificate Subject:
    6
    

awk編程

awk是三位前輩開發(fā)的編程語言股毫,awk是三位創(chuàng)建者的首字母≌傧危基本語言與C類似铃诬。

目前,使用的是gawk,Linux系統(tǒng)中/bin目錄下有awkgawk兩個命令趣席,前者實際上是后者的鏈接兵志。利用gawk語言可以實現(xiàn)數(shù)據(jù)查找、抽取文件中的數(shù)據(jù)宣肚、創(chuàng)建管道流命令等功能想罕。

我們可以簡單地將awk編程模型分位三個階段:

  • 讀輸入文件執(zhí)行的執(zhí)行代碼段(由BEGIN關(guān)鍵字標(biāo)識)
  • 讀取輸入文件時執(zhí)行代碼段
  • 讀輸入文件之后的執(zhí)行代碼段(由END關(guān)鍵字標(biāo)識)

調(diào)用方法分為兩種:Sehll命令行方式;腳本執(zhí)行霉涨。

awk模式匹配

任何awk語句都由模式和動作組成按价。模式是一組用于測試輸入行是否需要執(zhí)行動作的規(guī)則,動作是包含語句嵌纲、函數(shù)和表達(dá)式的執(zhí)行過程俘枫。awk支持所有的正則表達(dá)式元字符,以及?+兩個擴展元字符逮走。

wsx@wsx-ubuntu:~/桌面$ awk '/^$/{print "This is a blank line."}' input
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.

單引號中間為awk命令鸠蚪,由兩部分組成,以“/”符號分隔师溅,^$是模式茅信,花括號部分是動作。該awk表示一旦讀入的輸入文件是空行墓臭,就打印后面的字符串This is a blank line蘸鲸。

使用腳本(將命令輸入一個文件中):

wsx@wsx-ubuntu:~/桌面$ awk -f src.awk input
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.

內(nèi)容不止這些,我們先談?wù)勂渌拍睢?/p>

記錄和域

awk認(rèn)為輸入文件是結(jié)構(gòu)化的窿锉,awk將每個輸入文件行定義為記錄酌摇,行中的每一個字符串定義為域,域之間用空格嗡载、TAB鍵或其他符號進行分隔窑多,分隔域的符號就叫分隔符。(這個結(jié)構(gòu)化概念需要理解洼滚,很多命令和編程中都有涉及)

wsx@wsx-ubuntu:~/桌面$ awk '{print $2,$1,$4,$3}' sturecord 
Hao Li 025------------ njue
Ju Zhang 025---------- nju
Bin Wang 025------ seu
wsx@wsx-ubuntu:~/桌面$ awk '{print $0}' sturecord 
Li Hao  njue 025------------ 
Zhang Ju    nju 025---------- 
Wang Bin    seu 025------

可以通過對域的操作對文本進行重新排列埂息,也可以用print $0輸入所有域。

wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {one=1;two=2}{print $(one+two)}' sturecord 
njue
nju
seu

BEGIN字段中定義onetwo兩個變量并賦值遥巴。

-F選項用來改變分隔符千康,例如只以'\t'為分隔符。

wsx@wsx-ubuntu:~/桌面$ awk -F'\t' '{print $2}' sturecord 
025------------ 
025---------- 
025------

注意-F-f的區(qū)別铲掐。

awk還提供了另一種更方便的方法改變分隔符拾弃。

wsx@wsx-ubuntu:~/桌面$ cat sturecord 
Li Hao,njue,025------------ 
Zhang Ju,nju,025---------- 
Wang Bin,seu,025------
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=","}{print $1, $3}' sturecord 
Li Hao 025------------ 
Zhang Ju 025---------- 
Wang Bin 025------

關(guān)系和布爾運算符

awk定義了一組關(guān)系運算符用于awk模式匹配。如下表

運算符 意義
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于
~ 匹配正則表達(dá)式
!~ 不匹配正則表達(dá)式

用/etc/passwd文件做個例子

# 第1域匹配root
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} $1~/root/' /etc/passwd
# 全部域匹配root
root:x:0:0:root:/root:/bin/bash
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} $0~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 全部域不匹配nologin
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} $0!~/nologin/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:4:65534:sync:/bin:/bin/sync
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
lightdm:x:108:114:Light Display Manager:/var/lib/lightdm:/bin

awk條件語句與C類似摆霉,有if語句,if/else語句以及if/else else語句三種豪椿。

下面是支持的布爾運算符

運算符 意義
|| 邏輯或
&& 邏輯與
! 邏輯非
# 多條件精確匹配
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} {if($3==10||$4==10) print $0}' /etc/passwd
# 多條件模糊匹配
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} {if($3~10||$4~10) print $0}' /etc/passwd
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
lightdm:x:108:114:Light Display Manager:/var/lib/lightdm:/bin/false
whoopsie:x:109:116::/nonexistent:/bin/false
avahi-autoipd:x:110:119:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
wsx:x:1000:1000:wsx,,,:/home/wsx:/bin/bash
nx:x:123:1001::/var/NX/nx:/etc/NX/nxserver

表達(dá)式

一個awk表達(dá)式可以由數(shù)值颠毙、字符常量、變量砂碉、操作符蛀蜜、函數(shù)和正則表達(dá)式自由組合而成。

運算符 意義
+
-
*
/
%
^或** 乘方
++x 在返回x之前增蹭,x變量加1
x++ 在返回x之后滴某,x變量加1
wsx@wsx-ubuntu:~/桌面$ awk '/^$/{print x+=1}' input
1
2
3
4
5

系統(tǒng)變量

awk定義了很多內(nèi)建變量用于設(shè)置環(huán)境信息,我們稱為系統(tǒng)變量滋迈。分為兩種:一種用于改變awk的默認(rèn)值霎奢,例如域分隔符;第二種用于定義系統(tǒng)值饼灿,在處理文本時可以讀取這些系統(tǒng)值幕侠。

變量名 意義
$n 當(dāng)前記錄的第n個域,域用FS分隔
$0 記錄的所有域
ARGC 命令行參數(shù)的數(shù)量
ARGIND 命令行中當(dāng)前文件的位置(從0開始標(biāo)號)
ARGV 命令行參數(shù)的數(shù)組
CONVFMT 數(shù)字轉(zhuǎn)換格式
ENVIRON 環(huán)境變量關(guān)聯(lián)數(shù)組
ERRNO 最后一個系統(tǒng)錯誤的描述
FIELDWIDTHS 字段寬度列表碍彭,以空格鍵分隔
FILENAME 當(dāng)前文件名
FNR 瀏覽文件的記錄數(shù)
FS 字段分隔符晤硕,默認(rèn)是空格鍵
IGNORECASE 布爾變量,如果為真庇忌,則進行忽略大小寫的匹配
NF 當(dāng)前記錄中的域數(shù)量
NR 當(dāng)前記錄數(shù)
OFMT 數(shù)字的輸出格式
OFS 輸出域分隔符舞箍,默認(rèn)是空格鍵
ORS 輸出記錄分隔符,默認(rèn)是換行符
RLENGTH 由match函數(shù)所匹配的字符串長度
RS 記錄分隔符皆疹,默認(rèn)是空格鍵
RSTART 由match函數(shù)所匹配的字符串的第1個位置
SUBSEP 數(shù)組下標(biāo)分隔符疏橄,默認(rèn)值是\034

格式化輸出

awk借鑒C語言的語法,定義了printf輸出語句略就∩悠龋基本語法如下:

? printf(格式控制符, 參數(shù))

格式控制符分為修飾符和格式符兩種表牢,如下:

修飾符 意義
- 左對齊
width 域的步長
.prec 小數(shù)點右邊的位數(shù)
運算符 意義
%c ASCII字符
%d 整型數(shù)
%e 浮點數(shù)窄绒,科學(xué)計數(shù)法
%f 浮點數(shù)
%o 八進制數(shù)
%s 字符串
%x 十六進制數(shù)

內(nèi)置字符串函數(shù)

awk提供了強大的內(nèi)置字符串函數(shù),用于實現(xiàn)文本的字符串替換初茶、查找以及分隔等功能颗祝,下表列出:

函數(shù)名 意義
gsub(r,s) 在輸入文件中用s替換r
gsub(r,s,t) 在t中用s替換r
index(s,t) 返回s中字符串第一個t的位置
length(s) 返回s的長度
match(s,t) 測試s是否包含匹配t的字符串
split(r,s,t) 在t上將r分為序列s
sub(r,s,t) 將t中第1次出現(xiàn)的r替換為s
substr(r,s) 返回字符串r中從s開始的后綴部分
substr(r,s,t) 返回字符串r中從s開始長度為t的后綴部分

向awk腳本傳遞參數(shù)

awk腳本內(nèi)的變量可以在命令行中進行賦值浊闪,實現(xiàn)向awk腳本傳遞參數(shù)恼布,變量賦值放在腳本之后、輸入文件之前搁宾,格式為:

? awk腳本 parameter=value 輸入文件

條件語句和循環(huán)語句

看起來基本和C一樣折汞,框架如下——

if (條件表達(dá)式)
    動作1
[else
    動作2]
while(條件表達(dá)式)
    動作
do
    動作
while(條件表達(dá)式)
for(設(shè)置計數(shù)器初值; 測試計數(shù)器; 計數(shù)器變化)
    動作

數(shù)組

數(shù)組是存儲一系列值的變量,可通過索引來訪問數(shù)組的值盖腿,索引需要用中括號括起爽待,數(shù)組的基本格式為:

? array[index]=value

形式和C一樣损同,但awk數(shù)組無需定義數(shù)組類型和大小,可以直接賦值后使用鸟款。一般用在for循環(huán)中

for (variable in array)
    do somethng with array[variable]

更多操作可以查看:http://man.linuxde.net/awk

參考:Linux Shell編程——從初學(xué)到精通(第2版)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膏燃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子何什,更是在濱河造成了極大的恐慌组哩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件处渣,死亡現(xiàn)場離奇詭異伶贰,居然都是意外死亡,警方通過查閱死者的電腦和手機罐栈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門黍衙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荠诬,你說我怎么就攤上這事琅翻。” “怎么了柑贞?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵望迎,是天一觀的道長。 經(jīng)常有香客問我凌外,道長辩尊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任康辑,我火速辦了婚禮摄欲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疮薇。我一直安慰自己胸墙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布按咒。 她就那樣靜靜地躺著迟隅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪励七。 梳的紋絲不亂的頭發(fā)上智袭,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音掠抬,去河邊找鬼吼野。 笑死,一個胖子當(dāng)著我的面吹牛两波,可吹牛的內(nèi)容都是我干的瞳步。 我是一名探鬼主播闷哆,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼单起!你這毒婦竟也來了抱怔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤嘀倒,失蹤者是張志新(化名)和其女友劉穎野蝇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體括儒,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡绕沈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了帮寻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乍狐。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖固逗,靈堂內(nèi)的尸體忽然破棺而出浅蚪,到底是詐尸還是另有隱情,我是刑警寧澤烫罩,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布惜傲,位于F島的核電站,受9級特大地震影響贝攒,放射性物質(zhì)發(fā)生泄漏盗誊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一隘弊、第九天 我趴在偏房一處隱蔽的房頂上張望哈踱。 院中可真熱鬧,春花似錦梨熙、人聲如沸开镣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邪财。三九已至,卻和暖如春质欲,著一層夾襖步出監(jiān)牢的瞬間树埠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工把敞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弥奸,地道東北人榨惠。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓奋早,卻偏偏與公主長得像盛霎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耽装,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,158評論 2 33
  • sed與awk實例 文本間隔 在每一行后面增加一空行 將原來的所有空行刪除并在每一行后面增加一空行愤炸。這樣在輸出的文...
    stuha閱讀 1,897評論 0 21
  • 基礎(chǔ)命令 主要的命令和快捷鍵 Linux系統(tǒng)命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,095評論 0 0
  • 本文承接之前寫的三十分鐘學(xué)會AWK一文,在學(xué)習(xí)完AWK之后掉奄,趁熱打鐵又學(xué)習(xí)了一下SED规个,不得不說這兩個工具真的堪稱...
    mylxsw閱讀 4,398評論 3 74
  • sed工具簡介 用法:sed [-nefri] 動作參數(shù):-n:使用安靜模式(Silent)模式,一般在sed的...
    Bloo_m閱讀 1,005評論 0 1