一、sed的用法詳解
sed作為Linux的第二招,有著非常強大的文本處理功能。sed是一種在線編輯器、行編輯器,每次處理一行內容。在處理時,sed首先將行放在內存中的一塊臨時緩沖區,通常配叫做模式空間(pattern space)。如果模式空間的行符合sed的匹配模式則將該行處理后送到標準輸出,如果不匹配則不做任何改動送到標準輸出。模式空間中一般情況下只會有一行的內容(用到保持空間的高級用法可能會有多行),所以非常適合處理大的文本。sed和grep雖然都是流式文本處理工具,grep主要用來檢索條件關鍵字,sed則是根據檢索匹配處理文本。
sed的處理模式參考:
http://blog.oldboyedu.com/commands-sed/
-
sed的用法
sed [OPTIONS]… {script} [input-filer]… [actions]
-
常用選項:
-r:支持擴展正則表達式
-n:靜默模式,不打印任何信息,除非使用p
-e:指定多個腳本運行
-f:從指定腳本讀取腳本
-i:直接修改原文件
-
sed的地址定界:
#:#為數字,指定行
$:最后一行
/pattern/:被匹配到的每一行
地址范圍:
#,#:#是數字,表示從某行到某行
#,+#:某行及其接下來的幾行
/pat1/,/pat2/:第一次匹配的pat1行到第一次匹配的pat2行
#,/pat1/:從某行到接下來第一次匹配的pat1行
~:步長,1~2所有奇數行,2~2所有偶數行
-
編輯命令:
d:刪除模式空間匹配的行
p: 顯示模式空間中的內容
a:在行后面追加文本;支持使用\n實現多行追加
i:在行前面插入文本;支持使用\n實現多行插入
c :替換行為單行或多行文本
w /path: 保存模式匹配的行至指定文件
r /path:讀取指定文件的文本至模式空間中匹配到的行后
=: 為模式空間中的行打印行號
!:模式空間中匹配行取反處理
s///:查找替換,支持使用其它分隔符,s@@@,s###,通常在s前加%進行全文匹配。在最后可以加g:行內全局替換;p:顯示替換成功的行;w /path:將替換成功的行保存到某文件
-
sed的高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
注意:保持空間是sed高級用法的概念,在一般命令中用不到保持空間
二、vim編輯器
作為Linux中功能最強大的編輯器,vim的熟練使用勢必成為運維人員的標準配置。vim有復雜的快捷鍵功能,許多工作多年的運維工程師也不敢說能夠完全駕馭vim,但熟練使用vim絕對可以幫助我們節省大量的時間。
vim有六種模式(不同的版本可能不同可以通過vim的幫助文檔查看),但主要使用的只有三種:
-
命令模式:Linux的默認模式,可以移動光標并對文本粘貼復制
-
插入模式:編輯文件
-
擴展命令模式:在命令模式中鍵入:進入,可以批量修改并搜索關鍵字,可以設置當前文本的vim環境配置,保存退出
從默認的命令模式進入插入模式:
i:在當前光標處插入
I:在光標所在行的行首插入
a:在光標后插入
A:在當前光標所在行的行尾輸入
o: 在當前光標所在行的下方打開一個新行
O:在當前光標所在行的上方打開一個新行
鎖定界面并解鎖:
ctrl+s:鎖定界面,但實質上任然可以操作
ctrl+q:解鎖,從鎖定到解鎖之間的操作都有效
-
退出并保存文件
在擴展命令模式下:
:w filename (輸入 「w filename」將文章以指定的文件名filename保存)
:wq (輸入「wq」,存盤并退出vi)
:q! (輸入q!, 不存盤強制退出vi)
:x 保存退出
其他的一些用法
:r filename 讀文件內容到當前文件中
:w filename 將當前文件內容寫入另一個文件
:!command 在vim中執行命令行命令并顯示結果不會對當前打開的文件產生任何影響
:r!command 將命令行下的命令輸出結果寫到光標處,不能支持復雜的用法如sed的高級用法不支持
在命令模式下:
ZZ: 保存退出
ZQ:不保存退出
其他的用法:
h:左移光標一個字符
l:右移光標一個字符
k:光標上移一行
j:光標下移一行
^:光標移動至行首
0:數字“0”,光標移至文章的開頭
G:光標移至文章的最后
$:光標移動至行尾
Ctrl+f:向前翻屏
Ctrl+b:向后翻屏
Ctrl+d:向前翻半屏
Ctrl+u:向后翻半屏
x:刪除光標后面的字符
#x:刪除光標后的#個字符
X:刪除光標前面的字符
#X:刪除光標前面的#個字符
dd:刪除光標所在的行
#dd:刪除從光標所在行數的#行
yw:復制光標所在位置的一個字
#yw:復制光標所在位置的#個字
yy:復制光標所在位置的一行
#yy:復制從光標所在行數的#行
p:粘貼
u:取消操作
cw:更改光標所在位置的一個字
#cw:更改光標所在位置的#個字
其中y、d和c的用法大致相同
-
擴展模式下的地址定界:
#: 具體第#行,例如2表示第2行;
#,#: 從左側#表示行起始,到右側#表示行結尾
#,+#: 從左側#表示的行起始,加上右側#表示的行數
:2,+3 表示2到5行
.: 當前行
$: 最后一行
.,$-1 當前行到倒數第二行
%:全文, 相當于1,$
/pat1/,/pat2/:從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束
查找替換操作:
注意:替換為的內容:不能使用模式,但可以使用\1, \2, …等后向引用符號;還可以使用“&”引用前面查找時查找到的整個內容
格式有:s///或s@@@、s###,和sed的用法相同
后面可以加修飾符:
i: 忽略大小寫
g: 全局替換;默認情況下,每一行只替換第一次出現
gc:全局替換,每次替換前詢問
-
vim的寄存器:
有26個命名寄存器和1個無命名寄存器,常存放不同的剪貼版內容,可以不同會話間共享。
用a,b,…,z表示,用“寄存器表示,放在數字和命令之間
如:3"tyy 表示復制3行到t寄存器中
"tp 表示將t寄存器內容粘貼
未指定,將使用無命名寄存器
有10個數字寄存器,用0,1,…,9表示,0存放最近復制內容,1存放最近刪除內容。當新的文本變更和刪除時,1轉存到2,2轉存到3,以此類推。數字寄存器不能在不同會話間共享。
-
vim編輯二進制文件:
vim –b binaryfile
擴展命令模式下,利用xxd命令轉換為可讀的十六進制
:%!xxd
擴展命令模式下,利用xxd命令轉換回二進制
:%!xxd –r
-
vim的可視化編輯
v面向字符
V面向行
ctrl-v 面向塊
可視化鍵可用于與移動鍵結合使用:w,),},箭頭等
突出顯示的文字可以被刪除,復制,變更,過濾,搜索/替換等
如:要給連續的行前加注釋
ctrl+v進入視圖模式,選中要加注釋行的所有第一個字母,shift+i+#,按住shift再按i和#號然后送開所有的鍵再按esc就可以批量加#號
-
vim可以多文件編輯:
:next 下一個
:prev前一個
:first 第一個
:last 最后一個
:wall 保存所有
:qall退出所有
:wqall
-
vim多窗口編輯
vim -o|O file1 file2,,,
-o:水平分割
-O:垂直分割
在窗口間切換:ctrl+w
單文件分割:
Ctrl+w,s: split, 水平分割
Ctrl+w,v: vertical, 垂直分割
ctrl+w,q:取消相鄰窗口
ctrl+w,o:取消全部窗口
:wqall退出
-
vim的配置文件:
全局:/etc/vimrc
個人:~/.vimrc
1、行號
set number,簡寫set nu或se nu
取消顯示行號:set nonumber,簡寫set nonum或se nonu
2、括號匹對
set showmatch 簡寫:set sm或se sm(在7里以默認為開啟)
取消:set nosm
3、自動縮進
啟用:set ai
取消:set noai
4、高亮搜索
啟用:set hlsearch
取消:set nohlsearch 可以直接nohl取消高亮
5、語法高亮
syntax on
syntax off
6、忽略字符的大小寫
忽略:set ic
不忽略:set noic
7、文件格式
fileformat=unix
fileformat=dos
8、設置文本寬度
set textwidth=65(只有vim有),從左往又數,默認為80個字符
set wrapmargin=15 從右往左數,和上面的等價
…..
vim的用法在shell里有詳細的介紹:
命令行輸入vim進入vim的幫助文檔,set all可以查看所有的vim設置
練習及作業:
1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
[root@localhost ~]# sed -r 's/^[[:space:]]+//g' /etc/grub2.cfg # # DO NOT EDIT THIS FILE # # It is automatically generated by grub2-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### set pager=1 if [ -s $prefix/grubenv ]; then load_env ......
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
[root@localhost ~]# sed -r 's@^#[[:space:]]+\b@@g' /etc/fstab # # /etc/fstab Created by anaconda on Wed Aug 3 06:08:10 2016 # Accessible filesystems, by reference, are maintained under '/dev/disk' See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=1aa7af5a-15a0-4cf2-a11d-8304d67c7093 / xfs defaults 0 0 UUID=2fb41265-5d13-4ef0-82f6-3147009bd1a5 /boot xfs defaults 0 0 UUID=a5a6b450-ba91-4e5b-a5ad-a17e12a2a994 /testdir xfs defaults 0 0 UUID=1d6f94c4-7eb4-430c-b143-b63b498c1c98 swap swap defaults 0 0
3、在/root/install.log每一行行首增加#號
[root@localhost ~]# sed 's/^/#/g' /etc/fstab
# ## ## /etc/fstab ## Created by anaconda on Wed Aug 3 06:08:10 2016 ## ## Accessible filesystems, by reference, are maintained under '/dev/disk' ## See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info ## #UUID=1aa7af5a-15a0-4cf2-a11d-8304d67c7093 / xfs defaults 0 0 #UUID=2fb41265-5d13-4ef0-82f6-3147009bd1a5 /boot xfs defaults 0 0 #UUID=a5a6b450-ba91-4e5b-a5ad-a17e12a2a994 /testdir xfs defaults 0 0 #UUID=1d6f94c4-7eb4-430c-b143-b63b498c1c98 swap swap defaults 0 0
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
[root@localhost ~]# sed 's/^[^#]/#&/g' /etc/fstab # # /etc/fstab # Created by anaconda on Wed Aug 3 06:08:10 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # #UUID=1aa7af5a-15a0-4cf2-a11d-8304d67c7093 / xfs defaults 0 0 #UUID=2fb41265-5d13-4ef0-82f6-3147009bd1a5 /boot xfs defaults 0 0 #UUID=a5a6b450-ba91-4e5b-a5ad-a17e12a2a994 /testdir xfs defaults 0 0 #UUID=1d6f94c4-7eb4-430c-b143-b63b498c1c98 swap swap defaults 0 0
注意:最上面的回車換行沒有加#,即沒有匹配回車換行
[root@localhost ~]# sed '/^#/p;s/^[^#]/#&/pg;/^#/d;s/^/#/' /etc/fstab # # # /etc/fstab # Created by anaconda on Wed Aug 3 06:08:10 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # #UUID=1aa7af5a-15a0-4cf2-a11d-8304d67c7093 / xfs defaults 0 0 #UUID=2fb41265-5d13-4ef0-82f6-3147009bd1a5 /boot xfs defaults 0 0 #UUID=a5a6b450-ba91-4e5b-a5ad-a17e12a2a994 /testdir xfs defaults 0 0 #UUID=1d6f94c4-7eb4-430c-b143-b63b498c1c98 swap swap defaults 0 0
[root@localhost ~]# sed -r 's/^([^#]|$)/#&/' /etc/fstab # # # /etc/fstab # Created by anaconda on Wed Aug 3 06:08:10 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # #UUID=1aa7af5a-15a0-4cf2-a11d-8304d67c7093 / xfs defaults 0 0 #UUID=2fb41265-5d13-4ef0-82f6-3147009bd1a5 /boot xfs defaults 0 0 #UUID=a5a6b450-ba91-4e5b-a5ad-a17e12a2a994 /testdir xfs defaults 0 0 #UUID=1d6f94c4-7eb4-430c-b143-b63b498c1c98 swap swap defaults 0 0
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
[root@localhost ~]# echo "/etc/init.d/functions" |sed 's/.*\<//' functions
[root@localhost ~]# echo "/etc/init.d/functions" |sed -r 's@[^/]+.?$@@g' /etc/init.d/
[root@localhost ~]# echo "/etc/init.d/functions" |sed -r 's@(.*)/([^\]+.?)$@\1@g' /etc/init.d [root@localhost ~]# echo "/etc/init.d/functions" |sed -r 's@(.*)/([^\]+.?)$@\2@g' functions
6、利用sed 取出ifconfig命令中本機的IPv4地址
[root@localhost ~]# ifconfig |sed -r '/^[^ ]/!d;N;s/^([^ ]+).*\n[^0-9]+([0-9.]+).*/\1 \2/' eno16777736: 10.1.70.102 lo: 127.0.0.1 virbr0: 192.168.122.1
7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
[root@localhost ~]# ls /mnt/Packages/ |sed -r 's/.*\b([^.]+)\.[^.]+$/\1/'|sort|uniq -c 2000 i686 2938 noarch 1 TRANS 4069 x86_64
[root@localhost ~]# ls /mnt/Packages/|rev|cut -d. -f2|rev|sort|uniq -c 2000 i686 2938 noarch 1 TRANS 4069 x86_64
1、如何設置tab縮進為4個字符?
:set ts=4
2、復制/etc/rc.d/init.d/functions文件至/tmp目錄;替換/tmp/functions文件中的/etc/sysconfig/init為/var/log
:%s@/etc/sysconfig/init@/var/log@g
3、刪除/tmp/functions文件中所有以#開頭,且#后面至少有一個空白字符的行的行首的#號
:%s/^# / /g
原創文章,作者:nieda_linux,如若轉載,請注明出處:http://www.www58058.com/33221
文章結構清晰,有理有據,圖文并貌。