sed與vim淺析

sed與vim

sed

Stream EDitor, 行編輯器,sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”( pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等。

    用法: 

    sed [option]… 'script' inputfile… 

    script: '地址命令'

   常用選項:

    -n:不輸出模式空間內容的自動打印

    -e: 多點編輯

    -f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本

    -r: 支持使用擴展正則表達式 

    -i: 原處編輯

注意這里:↓

sed -i.bak '^U /r /etc/issue' f3  

更f3文件之前先把f3文件備份為 f3.bak文件,在對f3文件進行更改

編輯命令:

    d: 刪除模式空間匹配的行

    p: 顯示模式空間中的內容

    a \text:在行后面追加文本;支持使用\n實現多行追加

        sed ‘/root/a\superman’  /etc/passwd

[root@centos6 ~]# sed '/root/a\superman' /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        superman
        在匹配到的root行行后追加superman

    i \text:在行前面插入文本;支持使用\n實現多行插入

        sed ‘/root/i\superman’ /etc/passwd 

[root@centos6 ~]# sed '/root/i\superman' /etc/passwd
        superman
        root:x:0:0:root:/root:/bin/bash
        在匹配到的root行行前追加superman

    c \text:替換行為單行或多行文本

[root@centos6 ~]# sed '/root/c\superman' /etc/passwd
        superman
        bin:x:1:1:bin:/bin:/sbin/nologin
        代替匹配到的行

    w /path/to/somefile: 保存模式匹配的行至指定文件

[root@centos6 ~]# sed  '/root/ w/etc/issue' /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        [root@centos6 ~]# cat /etc/issue
        root:x:0:0:root:/root:/bin/bash

    r /path/from/somefile:讀取指定文件的文本至模式空間中匹配到的行后

[root@centos6 ~]# sed '/root/ r/etc/issue' /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        CentOS release 6.8 (Final)
             Kernel \r on an \m

    =: 為模式空間中的行打印行號

    !:模式空間中匹配行取反處理

    s///:查找替換,支持使用其它分隔符,s@@@,s###

地址定界: 

    (1) 不給地址:對全文進行處理

    (2) 單地址: #: 指定的行 /pattern/:被此處模式所能夠匹配到的每一行

[root@centos6 ~]# nl /etc/passwd | sed -n 3p 
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin

    (3) 地址范圍: #,# #,+# /pat1/,/pat2/ #,/pat1/

[root@centos6 ~]# sed -n '1,6p' /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/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

    (4) ~:步進 1~2 奇數行 2~2 偶數行

[root@centos6 ~]# nl /etc/passwd | sed -n 1~2p 
     1root:x:0:0:root:/root:/bin/bash
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@centos6 ~]# nl /etc/passwd | sed -n 2~2p 
     2bin:x:1:1:bin:/bin:/sbin/nologin
     4adm:x:3:4:adm:/var/adm:/sbin/nologin
     6sync:x:5:0:sync:/sbin:/bin/sync
     8halt:x:7:0:halt:/sbin:/sbin/halt
      10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

替換標記:

    g: 行內全局替換

    p: 顯示替換成功的行

    w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中

看下這幾個示例:

1、sed ‘/^$/d’ file 

[

root@centos6 ~]# cat -n /etc/issue
     1CentOS release 6.8 (Final)
     2Kernel \r on an \m
     3
[root@centos6 ~]# nl /etc/issue | sed '/^$/d' 
     1CentOS release 6.8 (Final)
     2Kernel \r on an \m
通過示例看出編輯命令d刪除/^$/(空行)

2、nl /etc/passwd | sed ‘2,5d’ 

[root@centos6 ~]# nl /etc/passwd | sed '2,5d'
     1root:x:0:0:root:/root:/bin/bash
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8halt:x:7:0:halt:/sbin:/sbin/halt
     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
刪除第二道第五行。

3、nl /etc/passwd | sed ‘2a tea’

[root@centos6 ~]# nl /etc/passwd | sed '2a tea'
     1root:x:0:0:root:/root:/bin/bash
     2bin:x:1:1:bin:/bin:/sbin/nologin
tea
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin
第二行后追加tea

4、sed –n‘s/root/&superman/p’ /etc/passwd  

[root@centos6 ~]# sed -n 's/root/&superman/p' /etc/passwd
rootsuperman:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/rootsuperman:/sbin/nologin
&為引用前面的root,在root單詞后后追加superman

5、sed –n‘s/root/superman&/p’ /etc/passwd 單詞前 

同上面的示例。

6、-e選項:

[root@centos6 ~]# cat f1
zang zang zang
root root root
1234 1234 1234
zang root 1234
[root@centos6 ~]# sed -e 's/root/root1/pg' -e 's/zang/haha/pg' -n f1
haha haha haha
root1 root1 root1
zang root1 1234
haha root1 1234
(-n:不輸出模式空間內容的自動打印。)
[root@centos6 ~]# sed -e 's/root/root1/pg' -e 's/zang/haha/pg'  f1
haha haha haha      替換后輸出到顯示器
haha haha haha      默認輸出到顯示器
root1 root1 root1     替換后輸出到顯示器
root1 root1 root1     默認輸出到顯示器
1234 1234 1234      沒有匹配更改,默認輸出到顯示器
zang root1 1234      先匹配root,更改后輸出到顯示器
haha root1 1234      匹配到zang,更改后顯示輸出到顯示器
haha root1 1234      默認輸出到顯示器

7、顯示空行號和打印空行號:

sed -n ‘/^$/=’  file 顯示空行行號
[root@centos6 ~]# sed -n '/^$/=' /etc/issue
3
 
sed –n –e ‘/^$/p’ –e ‘/^$/=’  file ?
[root@centos6 ~]# sed -n -e '/^$/p' -e '/^$/=' /etc/issue
3
打印空行,為空行打印行號。

8、地址界定的用法之一:  #,/pat1/ 

sed –n ‘2,/lp/p’  /etc/passwd 

[root@centos6 ~]# nl /etc/passwd | sed -n '2,/lp/p'
     2bin:x:1:1:bin:/bin:/sbin/nologin
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4adm:x:3:4:adm:/var/adm:/sbin/nologin
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
從2行開始到匹配到的lp的行

高級編輯命令:

     h: 把模式空間中的內容覆蓋至保持空間中

     H:把模式空間中的內容追加至保持空間中

     g: 從保持空間取出數據覆蓋至模式空間

     G:從保持空間取出內容追加至模式空間

     x: 把模式空間中的內容與保持空間中的內容進行互換

     n: 讀取匹配到的行的下一行覆蓋至模式空間

     N:追加匹配到的行的下一行至模式空間

     d: 刪除模式空間中的行

     D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed

在來看下這些示例:

sed -n 'n;p' FILE 

[root@centos6 ~]# nl /etc/passwd | sed -n 'n;p'
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     8  halt:x:7:0:halt:/sbin:/sbin/halt
    10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    12  games:x:12:100:games:/usr/games:/sbin/nologin
    14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    16  dbus:x:81:81:System message bus:/:/sbin/nologin
偶數行

sed '$!N;$!D' FILE 

[root@centos6 ~]# nl /etc/passwd | sed '$!N;$!D' 除了最后一行
    40  mage:x:505:505::/home/mage:/bin/bash
    41  zanghl:x:506:506::/home/zanghl:/bin/bash
顯示后兩行

sed '$!d' FILE

[root@centos6 ~]# nl /etc/passwd | sed '$!d'
    41  zanghl:x:506:506::/home/zanghl:/bin/bash
除了最后一行全部都刪除,只顯示最后一行。

sed ‘G’ FILE 

[root@centos6 ~]# sed 'G' /etc/passwd
root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

給每一行追加一個空行

sed ‘g’ FILE 

g: 從保持空間取出數據覆蓋至模式空間

保持空間為空,復制后的結果就是把原文件的每一行都變成空行。

sed ‘/^$/d;G’ FILE

[root@centos7 ~]# sed '/^$/d;G' /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/nologin

...
刪除空行;(G:從保持空間取出內容追加至模式空間),保持空間為空,追加輸出到模式空間。
這個命令輸出的結果就是在沒行下面加一個空行。

sed 'n;d' FILE 

[root@centos7 ~]# nl /etc/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

sed -n '1!G;h;$p' FILE

[root@centos7 ~]# sed -n '1!G;h;$p' /etc/passwd
mage:x:19999:19999::/home/mage:/bin/csh
zzzz:x:2012:2012::/home/zzzz:/bin/bash
roobash:x:2011:2011::/home/roobash:/bin/bash
rootash:x:2010:2010::/home/rootash:/bin/bash
nologin:x:2009:2009::/home/nologin:/bin/bash
basher:x:2008:2008::/home/basher:/bin/bash
倒敘。

vim編輯器

     vi編輯器是所有Unix及Linux系統下標準的編輯器,他就相當于windows系統中的記事本一樣,它的強大不遜色于任何最新的文

本編輯器。他是我們使用Linux系統不能缺少的工具。由于對Unix及Linux系統的任何版本,vi編輯器是完全相同的,學會它后,您將在Linux的世界里暢行無阻。

    vim具有程序編輯的能力,可以以字體顏色辨別語法的正確性,方便程序設計;因為程序簡單,編輯速度相當快速。vim可以當作

vi升級版本,他可以用多種顏色的方式來顯示一些特殊的信息。vim會依據文件擴展名或者是文件內的開頭信息,判斷該文件的內容

而自動的執行該程序的語法判斷式,再以顏色來顯示程序代碼與一般信息。vim里面加入了很多額外的功能,例如支持正則表達式的

搜索、多文件編輯、塊復制等等。 這對于我們在Linux上進行一些配置文件的修改工作時是很棒的功能。

使用vi和vim的三種主要模式:

    三種主要模式:

    命令模式(默認):移動光標,剪切/粘貼文本(進入vi的默認模式,能夠進行復制、黏貼、刪除等操作)

            100iwang [ESC] 粘貼“wang”100次

            <start position><command><end position> 

            Command:

            y 復制、d 刪除、gU 變大寫、gu 變小寫

            例如 0y$ 命令意味著:0 → 先到行頭

            y → 從這里開始拷貝

            $ → 拷貝到本行最后一個字符

            ye 從當前位置拷貝到本單詞的最后一個字符

    插入(編輯)模式:修改文本(從默認模式按下‘i’即可進入)

    擴展命令模式:保存,退出等(從默認模式按下“:”、'?'、'/'即可進入)

        地址定界:

            :start_pos,end_pos

            #: 具體第#行,例如2表示第2行

            #,#: 從左側#表示行起始,到右側#表示行結尾

            #,+#: 從左側#表示的行起始,加上右側#表示的行數

            :2,+3  表示2到5行

            .: 當前行

            $: 最后一行

            .,$-1 當前行到倒數第二行

            %:全文,相當于1,$

            /pat1/,/pat2/ 從第一次被pat1模式匹配到的行開始,一直到第一次被

            pat2匹配到的行結束 #,/pat/ /pat/,$

            使用方式:后跟一個編輯命令 d or y

            w file: 將范圍內的行另存至指定文件中

            r file:在指定位置插入指定文件中的所有內容

        查找

            /PATTERN:從當前光標所在處向文件尾部查找

            ?PATTERN:從當前光標所在處向文件首部查找

            n:與命令同方向          N:與命令反方向

    Esc鍵 退出當前模式

    Esc鍵 Esc鍵 總是返回到命令模式

打開文件:

    # vim [OPTION]… FILE…

    +#: 打開文件后,直接讓光標處于第#行的行首

    +/PATTERN:打開文件后,直接讓光標處于第一個被PATTERN匹配到的行的行首

    vim + file 直接打開file,光標在最后一行

    vim –b file 二進制方式打開文件

    vim –d file1 file2…  比較多個文件

    vim  -m file  只讀打開文件

    ex  file 或 vim –e直接進入ex模式如果該文件存在,文件被打開并顯示內容如果該文件不存在,當編輯后第一次存盤時創建它

關閉文件:

    擴展模式:

    :q 退出

    :q! 強制退出,丟棄做出的修改

    :wq 保存退出

    :x 保存退出

    命令模式:

    ZZ: 保存退出

    ZQ:不保存退出

模式轉換:

    插入模式 —-> 命令模式 ESC

    命令模式 —-> 擴展模式 : 

    擴展模式 —-> 命令模式 ESC

    鎖定和解鎖:CTRL+s,Ctrl+q

000.png

移動光標,進入插入模式

    命令模式 –> 插入模式

    i: insert, 在光標所在處輸入

    I:在當前光標所在行的行首輸入

    a: append, 在光標所在處后面輸入

    A:在當前光標所在行的行尾輸入

    o: 在當前光標所在行的下方打開一個新行

    O:在當前光標所在行的上方打開一個新行

111.png

改變、刪除、復制文本

222.png

vim的功能:

    塊選擇:

    這個功能可以讓我們復制一個矩形區域的內容,十分方便。

    v:字符選擇,會將光標經過的地方反白選擇;

    V:行選擇;

    Ctrl+v:塊選擇;

    y:復制反白的地方;

    d:刪除反白的地方。

444.png

vim的寄存器:

    有26個命名寄存器和1個無命名寄存器,常存放不同的剪貼版內容,可以不同會話間共享。

    用a,b,…,z表示,用“寄存器表示,放在數字和命令之間 如:3"tyy 表示復制3行到t寄存器中"tp表示將t寄存器內容粘貼

    未指定,將使用無命名寄存器有10個數字寄存器,用0,1,…,9表示,0存放最近復制內容,1存放最近刪除內容。當新的文本變

    更和刪除 時,1轉存到2,2轉存到3,以此類推。數字寄存器不能 在不同會話間共享。

編輯二進制文件:

    以二進制方式打開文件 vim –b binaryfile

    擴展命令模式下,利用xxd命令轉換為可讀的十六進制:%!xxd

    擴展命令模式下,利用xxd命令轉換回二進制 :%!xxd –r 

多文件模式:

    vim FILE1 FILE2 FILE3 …

        :next 下一個

        :prev 前一個

        :first 第一個

        :last 最后一個

        :wall 保存所有

        :qall 退出所有

        :wqall保存退出所有

使用多個“窗口”

    多文件分割 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環境設置:

    需要注意的是,vim會將i我們的以前的行為都記錄下來,以方便我們操作。

    vim常用的環境設置參數命令如下:

         :set nu  設置行號

         :set nonu 取消行號

         :set hlsearch 設置高亮度查找

         :set nohlsearch 取消高亮度查找

         :set backup 自動備份文件

         :set ruler 開啟右下角狀態欄說明

         :set showmode 顯示左下角的INSERT之類的狀態欄

         :set backspace={0,1,2} 設置退格鍵功能。為2時可以刪任意字符。為0或1時僅可以刪除剛才輸入的字符。

         :set all 顯示目前所有的環境參數值

         :set 顯示與系統默認值不同的參數值

         :syntax on/off 是否開啟依據相關程序語法顯示不同的顏色

         :set bg=dark/light 是否顯示不同的顏色色調

  但是我們沒有必要每次使用vim都要重新設置一次各個參數值。我們可以通過配置文件來直接規定我們習慣的vim操作環境。整體vim的設置值一般是放在/etc/vimrc中的。我們一般不要修改這個文件。我們可以通過修改~/.vimrc這個文件。如果不存在,可以手動創建。

原創文章,作者:zanghonglei,如若轉載,請注明出處:http://www.www58058.com/32594

(0)
zanghongleizanghonglei
上一篇 2016-08-10 13:58
下一篇 2016-08-10 13:58

相關推薦

  • shell 腳本基礎作業

    1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小 #!/bin/bash :<<EOF 顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小 EOF Host_name=`hostna…

    Linux干貨 2016-08-15
  • 文件系統磁盤管理上

    磁盤:主要作用用于存儲數據 早期一塊硬盤共有256個盤面,每個盤面有1024個磁道,每個磁道有63個扇區,每個扇區的大小是512byte 硬盤的命名: 早期IDE硬盤標記為hd scsi、usb、sas標記為sd 引用設備的方式 設備文件名 標卷 UUID 硬盤分區: 第0個磁道的第0個扇區存放的是磁盤的信息 MBR:Master Boot Record 主…

    Linux干貨 2016-08-30
  • 谷歌三大核心技術(三)Google BigTable中文版

    摘要 Bigtable是一個分布式的結構化數據存儲系統,它被設計用來處理海量數據:通常是分布在數千臺普通服務器上的PB級的數據。Google的很多項目使用Bigtable存儲數據,包括Web索引、Google Earth、Google Finance。這些應用對Bigtable提出的要求差異非常大,無論是在數據量上(從URL到網頁到衛星圖像)還是在響應速度上…

    Linux干貨 2015-04-13
  • LVS DR模型演示

    LVS DR模型演示 環境介紹: Directory     DIP eth0    10.1.249.158     VIP eth0:0  10.1.249.111 rs1  &nbsp…

    2016-10-30
  • 馬哥教育網絡班22期+第1周課程練習

    問題1: 計算機組成如下:CPU、存儲器、輸入設備、輸出設備1、中央處理器(Central Processing Unit,簡稱 CPU)。它主要由控制器、運算器等組成,并采用大規模集成電路工藝制成的芯片,又稱微處理器芯片。   CPU又由運算器和控制器組成。1)運算器 運算器又稱算術邏輯單元(Arithmetic Logic Unit簡…

    Linux干貨 2016-08-15
  • 文本處理工具

    分頁查看文件內容 less和more命令介紹 分頁查看文件內容:less和more less:一頁一頁地查看文件或STDIN輸出   # less FILE less的快捷鍵:     Ctrl+u:向上翻半屏     Ctrl+d:向下翻…

    Linux干貨 2016-08-07
欧美性久久久久