1. 程式人生 > >Linux sed和awk

Linux sed和awk

sed

strem editor  流編輯器

sed  編輯器是一行一行的處理檔案內容的。正在處理的內容存放在模式空間(緩衝區)內,處理完成後按照選項的規定進行輸出或檔案的修改。

sed主要用來自動編輯一個或多個檔案;簡化檔案的反覆操作;非互動式編譯檔案

語法:

sed 【options】  ‘【command】’ 【filename】

options:

-n  抑制自動(預設的)輸出  讀取下一個輸入行,-n要讀取的行號

-e  執行多個sed命令

-f  執行指令碼

-i  編輯檔案內容

-i.bak  編輯的同時創造.bak的備份

-r  使用擴充套件的正則表示式

command

a  在匹配後追加

i  在匹配後插入

p  列印

d  刪除

r/R  讀取檔案/一行

w  另存

s  查詢

c  替換

y  替換

h/H   複製拷貝/追加模式空間(緩衝區)到存放空間

g/G   貼上 從存放空間取回/追加到模式空間

x  兩個空間內容的交換

n/N  拷貝/追加下一行內容到當前

D  刪除\n之前的內容

P  列印\n之前的內容

b  無條件跳轉

t  滿足匹配後的跳轉

T  不滿足匹配時跳轉

顯示檔案第三行的內容

複製程式碼

[
[email protected]
~]# sed -n 3p /etc/passwd 對第三行進行操作 p打印出 daemon:x:2:2:daemon:/sbin:/sbin/nologin [[email protected] ~]# sed -n '1,3p' /etc/passwd 顯示1-3行的內容 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [[email protected] ~]# sed -n '1,3!p' /etc/passwd 加感嘆號就是除了1-3顯示其他所有內容 adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:997:995:User for polkitd:/:/sbin/nologin

複製程式碼

顯示第三行和之後的三行

[[email protected] ~]# sed -n '3,+3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

在檔案的頭插入“###”,在檔案尾插入“@@@”,把檔案第三行替換成“$$$”

[[email protected] ~]# sed '1i###' /etc/passwd
###
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologi   這個改完之後是不儲存的 ,原檔案還是老樣子

複製程式碼

[[email protected] ~]# sed '1i###' /etc/passwd > a.txt   重定向
[[email protected] ~]# sed '1i###' /etc/passwd >> a.txt   追加
[[email protected] ~]# head a.txt 
###
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

複製程式碼

複製程式碼

[[email protected] ~]# sed '[email protected]@@' /etc/passwd >> a.txt  在檔案尾部追加@@@   $代表尾部a代表追加
[[email protected] ~]# tail a.txt 
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zq:x:1000:1000:zq:/home/zq:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
@@@

複製程式碼

[[email protected] ~]# sed '3c$$$' /etc/passwd   第三行插入$$$
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
$$$

 

 

awk

AWK是一種優良的文字處理工具,linux及Unix環境中現有的功能最強大的資料處理引擎之一。這種程式設計及資料操作語言的最大功能取決於一個人所擁有的知識。awk命名:Alfred Aho Peter Weinberger和brian kemighan三個人的姓的縮寫。

最簡單地說,AWK是一種用於處理文字的程式語言工具。任何awk語句都是由模式和動作組成,一個awk指令碼可以有多個語句。模式決定動作語句的觸發條件和觸發時間。

特殊欄位:

BEGIN語句設定計數和列印頭部資訊,在任何動作之前進行。

END語句輸出統計結果,在完成動作之後執行。

分隔符預設是空格,可以用-F,改變成逗號為分隔符-F,或改成冒號-F

eg:準備要顯示的內容

vim result.txt

aa 7 17 27 37 47 57
bb 8 18 28 38 48 58
cc 9 19 29 39 49 59
dd 6 16 26 36 46 56

複製程式碼

[[email protected] ~]# awk "{print $0}" result.txt     雙引號怎麼不行,大神如果看到請給一下意見




[[email protected] ~]# awk '{print $0}' result.txt     $0顯示所有內容 
aa 7 17 27 37 47 57
bb 8 18 28 38 48 58
cc 9 19 29 39 49 59
dd 6 16 26 36 46 56
[[email protected] ~]# awk '{print $1}' result.txt     $1顯示內容的第一列
aa
bb
cc
dd

複製程式碼

顯示/etc/passwd第一列,以:作為分隔符

複製程式碼

[[email protected] ~]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

複製程式碼

顯示第一列和第三列內容

[[email protected] ~]# awk '{print $1,$3}' result.txt 
aa 17
bb 18
cc 19
dd 16                    有點兒python取列表字典裡面元素的意思

複製程式碼

[[email protected] ~]# awk 'BEGIN {print "name level result\n"} {print $1,$2,$3} END{ print "end of class1 results"}' result.txt 
name level result

aa 7 17
bb 8 18
cc 9 19
dd 6 16
end of class1 results    這更有點兒python巢狀的意思了,也不是給取的值 取個名字,也不是巢狀就是給要取的值賦了個名字

複製程式碼

[[email protected] ~]# awk '$2 >= 7 {print $0}' result.txt   快跟sql python 連上了
aa 7 17 27 37 47 57
bb 8 18 28 38 48 58
cc 9 19 29 39 49 59
[[email protected] ~]# awk '{ if($1 == "aa" || $2=="8") print $0 }' result.txt 
aa 7 17 27 37 47 57
bb 8 18 28 38 48 58   無處不在的if  或