AWK
AWK是一個優良的文本處理工具,Linux和Unix環境中現有的功能最強大的數據處理引擎之一。
- 語法
awk [選項參數] 'script' var=value file(s)
或
awk [選項參數] -f scriptfile var=value file(s)
- 調用方式
-
awk 命令行
你可以象使用普通UNIX 命令一樣使用awk,在命令行中你也可以使用awk 程序設計語言,,這種方法一般只用於解決簡單的問題。當然,你也可以在shell script 程序中引用awk 命令行甚至awk 程序腳本。 -
使用-f 選項調用awk 程序
awk 允許將一段awk 程序寫入一個文本文件,然后在awk 命令行中用-f 選項調用並執行這段程序。 -
利用命令解釋器調用awk 程序
利用UNIX 支持的命令解釋器功能,我們可以將一段awk 程序寫入文本文件,然后在它的第一行加上#!/bin/awk –f。
-
- 參數相關
FILENAME:awk瀏覽的文件名
FNR:awk瀏覽的文件的記錄數
FS:設置輸入域的分隔符
NF:瀏覽域的個數
NR:已讀的記錄數
OFS:輸出域分隔符
ORS:輸出記錄分隔符
RS:控制記錄分隔符
$0:指整條記錄
$1:第一個作用域及第一列
~:匹配,與==相比不是精確比較
!~:不匹配,不精確比較
==:等於,必須全部相等,精確比較
!=:不等於,精確比較
&&:邏輯與
||:邏輯或
+:匹配時表示1個或1個以上
/[0-9][0-9]+/:兩個或兩個以上數字
/[0-9][0-9]*/:一個或一個以上數字
- 案例
過濾/etc/passwd文件,以冒號為分隔符,過濾出第一列
awk -F ':' '{print $1}' /etc/passwd
統計/etc/passwd文件中,一共有多少個用戶
awk '{count++;print $0;} END {print "user count is:",count} ' /etc/passwd
統計/etc/passwd文件,打印出文件名,已讀的記錄數,以冒號為分隔符,每行瀏覽域的個數,每行記錄的內容
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF, ",linecontent:" $0}' /etc/passwd
統計/etc/passwd文件,從0開始,依次往下瀏覽,一直到最后並打印出循環了多少次
awk 'BEGIN {count=0;print "start use count is:",count} {count++;print $0;} END {print "user count is:",count} ' /etc/passwd
統計當前目錄下,所有文件總大小,並輸出到all file siz is
ll |awk 'BEGIN {size=0} {size=size+$5} END {print "all file size is:",size}'
統計當前目錄下,除去4096大小的文件外,所有文件大小的總和,輸出到all file siz is
ll |awk 'BEGIN {size=0} {if ($5 !=4096) size=size+$5} END {print "all file size is:",size}'
統計/etc/passwd文件,在每行行首從0開始記錄瀏覽行數
awk -F ':' 'BEGIN {null=0} {name[null]=$1;null++} END {for(i=0;i<NR;i++) print i,name[i]}' /etc/passwd
統計netstat -anp 狀態為LISTEN和CONNECT的連接數量分別是多少
netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'
計算/home目錄下,普通文件的大小,使用KB作為單位
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024,"KB"}'
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",int(sum/1024),"KB"}' //int是取整的意思
統計/home目錄下不同用戶的普通文件的總數是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s \n",i," ",sum[i]}'
mysql 199
root 374
統計/home目錄下不同用戶的普通文件的大小總size是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf "%-6s %-5s %-3s %-2s \n",i," ",sum[i]/1024/1024,"MB"}'
SED
SED即Stream Editor文本流編輯,是一個“非交互式”面向字符流的編輯器。能同時處理多個文件多行的內容,可以不對原文件改動,把整個文件輸入到屏幕,可以把只匹配到模式的內容輸入到屏幕上。還可以對原文件改動,但是不會再屏幕上返回結果。
- 語法
sed [options] 'command' file(s)
或者
sed [options] -f scriptfile file(s)
- 選項
-e :直接在命令行模式上進行sed動作編輯,此為默認選項;
-f :將sed的動作寫在一個文件內,用–f filename 執行filename內的sed動作;
-i :直接修改文件內容;
-n :只打印模式匹配的行;
-r :支持擴展表達式;
-h或--help:顯示幫助;
-V或--version:顯示版本信息;
-a :新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行);
-c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行;
-d ∶刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚;
-i ∶插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行);
-p ∶列印,亦即將某個選擇的資料印出;通常 p 會與參數 sed -n 一起運作;
-s ∶取代,可以直接進行取代的工作哩;通常這個 s 的動作可以搭配正規表示法;
- 常用命令
a\\ 在當前行下面插入文本。
i\\ 在當前行上面插入文本。
c\\ 把選定的行改為新的文本。
d 刪除,刪除選擇的行。
D 刪除模板塊的第一行。
s 替換指定字符
h 拷貝模板塊的內容到內存中的緩沖區。
H 追加模板塊的內容到內存中的緩沖區。
g 獲得內存緩沖區的內容,並替代當前模板塊中的文本。
G 獲得內存緩沖區的內容,並追加到當前模板塊文本的后面。
l 列表不能打印字符的清單。
n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N 追加下一個輸入行到模板塊后面並在二者間嵌入一個新行,改變當前行號碼。
p 打印模板塊的行。
P(大寫) 打印模板塊的第一行。
q 退出Sed。
b lable 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。
r file 從file中讀行。
t label if分支,從最后一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
T label 錯誤分支,從最后一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
w file 寫並追加模板塊到file末尾。
W file 寫並追加模板塊的第一行到file末尾。
! 表示后面的命令對所有沒有被選定的行發生作用。
= 打印當前行號碼。
'#' 把注釋擴展到下一個換行符以前。
- 替換標記
g 表示行內全面替換。
p 表示打印行。
w 表示把行寫入一個文件。
x 表示互換模板塊中的文本和緩沖區中的文本。
y 表示把一個字符翻譯為另外的字符(但是不用於正則表達式)
\\1 子串匹配標記
& 已匹配字符串標記
- sed元字符集
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。
$ 匹配行結束,如:/sed$/匹配所有以sed結尾的行。
. 匹配一個非換行符的任意字符,如:/s.d/匹配s后接一個任意字符,最后是d。
* 匹配0個或多個字符,如:'/*sed/'匹配所有模板是一個或多個空格后緊跟sed的行。
[] 匹配一個指定范圍內的字符,如/[ss]ed/匹配sed和Sed。
[^] 匹配一個不在指定范圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。
\\(..\\) 匹配子串,保存匹配的字符,如s/\\(love\\)able/\\1rs,loveable被替換成lovers。
& 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。
\\< 匹配單詞的開始,如:/\\\\> 匹配單詞的結束,如/love\\>/匹配包含以love結尾的單詞的行。
x\\{m\\} 重復字符x,m次,如:/0\\{5\\}/匹配包含5個0的行。
x\\{m,\\} 重復字符x,至少m次,如:/0\\{5,\\}/匹配至少有5個0的行。
x\\{m,n\\} 重復字符x,至少m次,不多於n次,如:/0\\{5,10\\}/匹配5~10個0的行。
- sed匹配模式正則
sed '5 q' /etc/passwd #打印前5行
sed -n '/r*t/p' /etc/passwd #打印匹配r有0個或者多個,后接一個t字符的行
sed -n '/.r.*/p' /etc/passwd #打印匹配有r的行並且r后面跟任意字符
sed -n '/o*/p' /etc/passwd #打印o字符重復任意次
sed -n '/o\{1,\}/p' /etc/passwd #打印o字重復出現一次以上
sed -n '/o\{1,3\}/p' /etc/passwd #打印o字重復出現一次到三次之間以上
- sed對文件內容增加(-i修改源文件)
cat file.txt
Python
Django
Flask
Hello World
1. 匹配字符行的行首添加
sed '/Python/s/^/Lain /' file.txt
Lain Python
Django
Flask
Hello World
2. 匹配字符行的行尾添加
sed 's/Python/& Lain/' file.txt
Python Lain
Django
Flask
Hello World
3. 匹配字符前添加
sed 's/World/Lain &/' file.txt
Python
Django
Flask
Hello Lain World
4. 匹配字符后添加
sed 's/World/& Lain/' file.txt
Python
Django
Flask
Hello World Lain
5. 匹配行的上一行添加
sed '/Flask/i\HTML' file.txt
或者
sed '/Flask/i HTML' file.txt
Python
Django
HTML
Flask
Hello World
6. 匹配行的下一行添加
sed '/Flask/a HTML' file.txt
或者
sed '/Flask/a\HTML' file.txt
Python
Django
Flask
HTML
Hello World
7. 所有行行首添加
sed 's/^/Lain /g' file.txt
或者
sed 's/^/Lain /' file.txt
Lain Python
Lain Django
Lain Flask
Lain Hello World
8. 所有行行尾添加
sed 's/$/ Lain/' file.txt
或者
sed 's/$/ Lain/g' file.txt
Python Lain
Django Lain
Flask Lain
Hello World Lain
9.指定行添加內容
sed '1,2s/$/ Lain/g' file.txt #1,2行行尾添加
sed '1,2s/^/# /' file.txt #1,2行行首添加
- sed對文件內容刪除(-i修改源文件)
cat file.txt
#Python web
#Django web
Flask web
Hello World web
JavaScript
PHP Nginx
1. 刪除行首是'#'的行
sed '/^#/d' file.txt
Flask web
Hello World web
JavaScript
PHP Nginx
2. 刪除行首不是'#'的行
sed '/^#/!d' file.txt
#Python web
#Django web
3. 刪除行
sed '1d' file.txt #刪除第一行
sed '$d' file.txt #刪除最后一行
sed '1,2d' file.txt #刪除指定行
4. 刪除匹配字符所在的行
sed '/Hello/d' file.txt
#Python web
#Django web
Flask web
JavaScript
PHP Nginx
- sed對文件內容修改(-i修改源文件)
cat file.txt
#Python web
#Django web
Flask web
Hello World web
JavaScript
PHP Nginx
1. 更換匹配字符所在行
sed '/Flask/c\LAIN' file.txt
#Python web
#Django web
LAIN
Hello World web
JavaScript
PHP Nginx
2. 更換文件中所有匹配字符
sed 's/web/core/' file.txt
#Python core
#Django core
Flask core
Hello World core
JavaScript
PHP Nginx
3. 更換匹配字符所在行的關鍵字
sed '/Flask/s@web@core@' file.txt
或者
sed '/Flask/s#web#core#' file.txt
#Python web
#Django web
Flask core
Hello World web
JavaScript
PHP Nginx
4. 替換匹配關鍵字所在行的'#'
sed '/web/s/#//' file.txt
Python web
Django web
Flask web
Hello World web
JavaScript
PHP Nginx
GREP
GREP(global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
grep的工作方式,它在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板后的所有字符串被看作文件名。搜索的結果被送到屏幕,不影響原文件內容。
grep可用於shell腳本,因為grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。
- 語法
grep [OPTION]... PATTERN [FILE]...
- 匹配模式
-E, --extended-regexp 擴展正則表達式egrep
-F, --fixed-strings 一個換行符分隔的字符串的集合fgrep
-G, --basic-regexp 基本正則
-P, --perl-regexp 調用的perl正則
-e, --regexp=PATTERN 后面根正則模式,默認無
-f, --file=FILE 從文件中獲得匹配模式
-i, --ignore-case 不區分大小寫
-w, --word-regexp 匹配整個單詞
-x, --line-regexp 匹配整行
-z, --null-data 一個 0 字節的數據行,但不是空行
-s, --no-messages 不顯示錯誤信息
-v, --invert-match 顯示不匹配的行
-V, --version 顯示版本號
--help 顯示幫助信息
--mmap use memory-mapped input if possible
- 控制項
輸入控制:
-m, --max-count=NUM 匹配的最大數
-b, --byte-offset 打印匹配行前面打印該行所在的塊號碼。
-n, --line-number 顯示的加上匹配所在的行號
--line-buffered 刷新輸出每一行
-H, --with-filename 當搜索多個文件時,顯示匹配文件名前綴
-h, --no-filename 當搜索多個文件時,不顯示匹配文件名前綴
--label=LABEL print LABEL as filename for standard input
-o, --only-matching 只顯示一行中匹配PATTERN 的部分
-q, --quiet, --silent 不顯示任何東西
--binary-files=TYPE 假定二進制文件的TYPE 類型;TYPE 可以是`binary', `text', 或`without-match'
-a, --text 匹配二進制的東西
-I 不匹配二進制的東西
-d, --directories=ACTION 目錄操作,讀取,遞歸,跳過
-D, --devices=ACTION 設置對設備,FIFO,管道的操作,讀取,跳過
-R, -r, --recursive 遞歸調用
--include=PATTERN 只查找匹配FILE_PATTERN 的文件
--exclude=PATTERN 跳過匹配FILE_PATTERN 的文件和目錄
--exclude-from=FILE 跳過所有除FILE 以外的文件
-L, --files-without-match 匹配多個文件時,顯示不匹配的文件名
-l, --files-with-matches 匹配多個文件時,顯示匹配的文件名
-c, --count 顯示匹配了多少次
-Z, --null 在FILE 文件最后打印空字符
文件控制:
-B, --before-context=NUM 打印匹配本身以及前面的幾個行由NUM控制
-A, --after-context=NUM 打印匹配本身以及隨后的幾個行由NUM控制
-C, --context=NUM 打印匹配本身以及隨后,前面的幾個行由NUM控制
-NUM 根-C的用法一樣的
--color[=WHEN],
--colour[=WHEN] 使用標志高亮匹配字串;
-U, --binary 使用標志高亮匹配字串;
-u, --unix-byte-offsets 當CR 字符不存在,報告字節偏移(MSDOS 模式)
- 案例
- 測試文件
cat test.txt
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
colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
unbound:x:995:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
libstoragemgmt:x:993:990:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
geoclue:x:992:989:User for geoclue:/var/lib/geoclue:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
setroubleshoot:x:991:988::/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
chrony:x:990:985::/var/lib/chrony:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
pcp:x:989:984:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
gnome-initial-setup:x:988:983::/run/gnome-initial-setup/:/sbin/nologin
1. 匹配含有'mysql'的行
grep mysql test.txt
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
2. 匹配以'mysql'或者'tss'開頭的行
grep '^\(tss\|mysql\)' test.txt
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
3. 遞歸匹配'soft'目錄下所有含有'Daemon'的行並顯示行號
grep -Frn 'Daemon' /soft
4. 不顯示以'mysql'或者'tss'開頭的行
grep -n '^\(root\|mysql\)' test.txt
5. 不區分大小寫匹配
grep -i '^\(ROOT\|MYSQL\)' test.txt
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
6. 匹配關鍵字並打印前后
grep -A3 'gdm' test.txt #A后三行
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
grep -B3 'gdm' test.txt #B前三行
grep -B3 'gdm' test.txt #C前后三行
FIND
FIND命令用來在指定目錄下查找文件。任何位於參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。
- 語法
find path -option [ -print ] [ -exec -ok command ] {} \;
- 參數
pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print: find命令將匹配的文件輸出到標准輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為'command' { } \;,注意{ }和\;之間的空格。
-ok: 和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
-print 將查找到的文件輸出到標准輸出
-exec command {} \; —–將查到的文件執行command操作,{} 和 \;之間有空格;
-mount, -xdev : 只檢查和指定目錄在同一個文件系統下的文件,避免列出其它文件系統中的文件
-amin n : 在過去 n 分鍾內被讀取過
-anewer file : 比文件 file 更晚被讀取過的文件
-atime n : 在過去 n 天過讀取或執行過的文件,,-n指n天以內,+n指n天以前
-cmin n : 在過去 n 分鍾內被修改過
-mtime n : 按文件內容修改時間來查找文件,-n指n天以內,+n指n天以前
-cnewer file :比文件 file 更新的文件
-ctime n : 在過去 n 天過修改過的文件包括權限修改,-n指n天以內,+n指n天以前
-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名稱是 name
-ipath p, -path p : 路徑名稱符合 p 的文件,ipath 會忽略大小寫
-name name, -iname name : 文件名稱符合 name 的文件。iname 會忽略大小寫
-depth : 使查找在進入子目錄前先行查找完本目錄
-fstype : 查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-mount : 查文件時不跨越文件系統mount點
-follow : 如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio : 查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-prune : 忽略某個目錄
- 案例
find -name april* 在當前目錄下查找以april開始的文件
find -name april* fprint file 在當前目錄下查找以april開始的文件,並把結果輸出到file中
find -name ap* -o -name may* 查找以ap或may開頭的文件
find /mnt -name tom.txt -ftype vfat 在/mnt下查找名稱為tom.txt且文件系統類型為vfat的文件
find /mnt -name t.txt ! -ftype vfat 在/mnt下查找名稱為tom.txt且文件系統類型不為vfat的文件
find /tmp -name wa* -type l 在/tmp下查找名為wa開頭且類型為符號鏈接的文件
find /home -mtime -2 在/home下查最近兩天內改動過的文件
find /home -atime -1 查1天之內被存取過的文件
find /home -mmin +60 在/home下查60分鍾前改動過的文件
find /home -amin +30 查最近30分鍾前被存取過的文件
find /home -newer tmp.txt 在/home下查更新時間比tmp.txt近的文件或目錄
find /home -anewer tmp.txt 在/home下查存取時間比tmp.txt近的文件或目錄
find /home -used -2 列出文件或目錄被改動過之后,在2日內被存取過的文件或目錄
find /home -user cnscn 列出/home目錄內屬於用戶cnscn的文件或目錄
find /home -uid +501 列出/home目錄內用戶的識別碼大於501的文件或目錄
find /home -group cnscn 列出/home內組為cnscn的文件或目錄
find /home -gid 501 列出/home內組id為501的文件或目錄
find /home -nouser 列出/home內不屬於本地用戶的文件或目錄
find /home -nogroup 列出/home內不屬於本地組的文件或目錄
find /home -name tmp.txt -maxdepth 4 列出/home內的tmp.txt 查時深度最多為3層
find /home -name tmp.txt -mindepth 3 從第2層開始查
find /home -empty 查找大小為0的文件或空目錄
find /home -size +512k 查大於512k的文件
find /home -size -512k 查小於512k的文件
find /home -links +2 查硬連接數大於2的文件或目錄
find /home -perm 0700 查權限為700的文件或目錄
find /tmp -name tmp.txt -exec cat {} \; 在/tmp目錄下搜索並查看tmp.txt文件
find /tmp -name tmp.txt -ok rm {} \; 在/tmp目錄下搜索並刪除tmp.txt文件
find /tmp -type f -ctime +30 -ok rm {} \; 搜索/tmp下30天以前創建的文件並刪除
find /tmp -type f -ctime +7 -exec cp {} /soft \; 搜索/tmp下7天以前創建的文件並拷貝到/soft目錄下
find / -amin -10 查找在系統中最后10分鍾訪問的文件
find / -atime -2 查找在系統中最后2天訪問的文件
find / -empty 查找在系統中為空的文件或者文件夾
find / -group cat 查找在系統中屬於 groupcat的文件
find / -mmin -5 查找在系統中最后5分鍾里修改過的文件
find / -mtime -1 查找在系統中最后24小時里修改過的文件
find / -nouser 查找在系統中屬於作廢用戶的文件
find / -user fred 查找在系統中屬於FRED這個用戶的文件