sed :
正則表達式
非交互式的流編輯器,經過多種轉換修改流經他的文本,並將輸出結果打印到屏幕上,但並不改變文件自身,能夠作的編輯動做包括刪除,查找,替換,插入,添加或者從其餘文件中讀取數據。
c#
使用場景:數組
過於龐大的文本,有規律的文本修改,加快文件處理速度,常規修改困難的文本
bash
語法:編輯器
sed [參數] 命令 目錄
ide
工做機制:函數
每次讀取一行文本至「模式空間」中,在其中完成處理,並將處理 結果輸出至標準輸出設備
工具
經常使用參數:spa
-r 支持擴展正則表達式語法
命令行
-n 使用安靜模式,使用後只有通過sed特殊處理的那行纔會被列出來
-e 直接在指令模式上進行動做編輯
-f 將sed 的動做寫一個文檔,-f filename 則能夠執行filename內的sed 動做
-i 直接修改讀取的檔案內容,而不是由屏幕輸出
命令:
[n1[,n2]] function
n1,n2 :不見得會存在,通常表明‘選擇進行的行數’
命令選項:
a 新增,能夠接字符串,而字符串會出如今新的下一行中
c 取代,能夠接字符串,這些字符串能夠取代n1,n2之間的行
d 刪除
i 插入,後面接的字符串會在新的上一行出現
p 打印模式空間的行
P打印匹配的第一行
g 全局取代
s/old/new 用new替換正則表達式old --通常於g連用
= 顯示行號
w /path/to/somefile:把指定的內容另存至/path/to/somefile路徑所指定的文件中;
r /path/from/somefile:在文件的指定位置插入另外一個文件的全部內容,完成文件合併;
[root@iZ28qzns9m4Z bashtest]# nl passwd |sed 's/user001/usernew001/g'
[root@iZ28qzns9m4Z bashtest]# nl passwd |sed '2,5d' 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt [root@iZ28qzns9m4Z bashtest]# nl passwd |sed 'p' 1 root:x:0:0:root:/root:/bin/bash 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@iZ28qzns9m4Z bashtest]# sed -i 's/\:/\#/g' passwd [root@iZ28qzns9m4Z bashtest]# cat passwd 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
高級命令:
h:用模式空間中的內容覆蓋保持空間的內容;
H:把模式空間中的內容追加至保持空間中內容的後面;
g:從保持空間中取到其內容,並將其覆蓋模式空間中的內容;
G:從保持空間中取到其內容,並將其追加在模式空間中的內容的後面;
x:把保持空間和模式空間中的進行交換;
n:讀取匹配到的行的下一行至模式空間;(會覆蓋模式空間中的原有內容);
N:讀取匹配到的行的下一行至模式空間,追加在模式空間中原有內容的後面;
d:刪除模式空間中的內容;
D:刪除多行模式空間中的首行;
注意:命令功能可以使用!取反;分號可用於分隔腳本;
[root@iZ28qzns9m4Z bashtest]# sed 'G' passwd root#x#0#0#root#/root#/bin/bash bin#x#1#1#bin#/bin#/sbin/nologin daemon#x#2#2#daemon#/sbin#/sbin/nologin [root@iZ28qzns9m4Z bashtest]# nl passwd |sed 'n;d' 1 root#x#0#0#root#/root#/bin/bash 3 daemon#x#2#2#daemon#/sbin#/sbin/nologin 5 lp#x#4#7#lp#/var/spool/lpd#/sbin/nologin 7 shutdown#x#6#0#shutdown#/sbin#/sbin/shutdown 9 mail#x#8#12#mail#/var/spool/mail#/sbin/nologin 11 games#x#12#100#games#/usr/games#/sbin/nologin 13 nobody#x#99#99#Nobody#/#/sbin/nologin
經常使用正則表達式:
^ 匹配行開始
$ 匹配行的結束
. 匹配任意非換行字符
\(..\)保存匹配字符
x\{n\} 重複字符x,n次
x\{m,\} 重複字符x,至少m次
AWK:基於列的文本處理工具,他認爲文件時有單詞和空白字符組成
格式:
awk '條件類型1{動做1} 條件類型2{動做2}' filename
awk [options] 'program' file file ...
awk [options] 'PATTERN{action}' file file ...
要點:
(1) 各項目之間使用逗號分隔,而輸出時則使用輸出分隔符分隔;
(2)輸出的各item能夠字符串或數值、當前記錄的字段、變量或awk的表達式;數值會被隱式轉換爲字符串後輸出;
(3) print後面item若是省略,至關於print $0;輸出空白,使用pirnt "";
運算符:
運算符 描述
= += -= *= /= %= ^= **= 賦值
?: C條件表達式
|| 邏輯或
&& 邏輯與
~ ~! 匹配正則表達式和不匹配正則表達式
< <= > >= != == 關係運算符
空格 鏈接
+ - 加,減
* / & 乘,除與求餘
+ - ! 一元加,減和邏輯非
^ *** 求冪
++ -- 增長或減小,做爲前綴或後綴
$ 字段引用
in 數組成員
環境變量:
變量 描述
$n 當前記錄的第n個字段,字段間由FS分隔。
$0 完整的輸入記錄。
ARGC 命令行參數的數目。
ARGIND 命令行中當前文件的位置(從0開始算)。
ARGV 包含命令行參數的數組。
CONVFMT 數字轉換格式(默認值爲%.6g)
ENVIRON 環境變量關聯數組。
ERRNO 最後一個系統錯誤的描述。
FIELDWIDTHS 字段寬度列表(用空格鍵分隔)。
FILENAME 當前文件名。
FNR 同NR,但相對於當前文件。
FS 字段分隔符(默認是任何空格)。
IGNORECASE 若是爲真,則進行忽略大小寫的匹配。
NF 當前記錄中的字段數。
NR 當前記錄數。
OFMT 數字的輸出格式(默認值是%.6g)。
OFS 輸出字段分隔符(默認值是一個空格)。
ORS 輸出記錄分隔符(默認值是一個換行符)。
RLENGTH 由match函數所匹配的字符串的長度。
RS 記錄分隔符(默認是一個換行符)。
RSTART 由match函數所匹配的字符串的第一個位置。
SUBSEP 數組下標分隔符(默認值是/034)。
三、awk的printf命令
命令的使用格式:printf format, item1, item2,...
要點:
(1) 要指定format;
(2) 不會自動換行;如需換行則須要給出\n
(3) format用於爲後面的每一個item指定其輸出格式;
format格式的指示符都%開頭,後跟一個字符:
%c: 顯示字符的ASCII碼;
%d, %i: 十進制整數;
%e, %E: 科學計數法顯示數值;
%f: 顯示浮點數;
%g, %G: 以科學計數法格式或浮點數格式顯示數值;
%s: 顯示字符串;
%u: 顯示無符號整數;
%%: 顯示%自身;
修飾符:
#:顯示寬度
-:左對齊
+:顯示數值的符號
.#: 取值精度
四、awk輸出重定向
print items > output-file
print items >> output-file
print items | command
特殊文件描述符:
/dev/stdin: 標準輸入
/dev/stdout: 標準輸出
/dev/stderr: 錯誤輸出
awk的內置函數
split(string,array[,fieldsep[,seps]]):
功能:將string表示的字符串以fieldsep爲分隔符進行切片,並切片後的結果保存至array爲名的數組中;數組下標從1開始;
length(string)
功能:返回給定字串的長度
substr(string,start[,length])
功能:從string中取子串,從start爲起始位置爲取length長度的子串;
[root@iZ28qzns9m4Z bashtest]# last -n 5 |awk '{print $1 "\t" $3}' root 211.161.27.115 root 61.182.229.120 root 61.182.229.120 root 180.91.225.119 root 180.91.225.119 wtmp Tue [root@iZ28qzns9m4Z bashtest]# [root@iZ28qzns9m4Z bashtest]# awk '{print substr($1,6)}' passwd x#0#0#root#/root#/bin/bash #1#1#bin#/bin#/sbin/nologin n#x#2#2#daemon#/sbin#/sbin/nologin #3#4#adm#/var/adm#/sbin/nologin [root@iZ28qzns9m4Z bashtest]# nl passwd |awk '{print length}' 38 39 46