magedu_20160808

行編輯器sed與vim文本處理器

    一.行編輯器sed的使用介紹

    sed英文全稱stream editor,行編輯器。其工作模式為將文件中內容按行轉移至sed模擬空間中,根據地址判定此行是否匹配,如果匹配,根據命令輸出并打印,如果不匹配,按照默認打印到屏幕上。它的作用是根據選項和地址界定‘script’命令實現對符合相關篩選條件的行更改顯示。其用法為:sed [option]… 'script' file 。


      1.選項

    -n:只顯示匹配到的行,不匹配的行統統不顯示

    -e:多點編輯

    -f 文件絕對路徑:從指定路徑文件中讀取編輯腳本

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

    -i:在原文件中編輯

    只有選項無法匹配所需要的固定行,這里需要搭配地址命令‘script’選取固定范圍來使用。


      2.地址

    地址范圍的選定有時會根據正則表達式的形式匹配,常見的地址范圍規定有如下:

    a.單地址

    #(數字):代表所匹配的固定行

    /pattern/:pattern匹配的符合條件的每一行

    b.無地址:對全局進行處理

    c.地址范圍

    #1,#2:從#1行到#2行

    #1,+#2:從#1開始,一直到#1+#2之間的所有行

    /part1/,/part2/:從符合part1的第一行到符合part2的第一行的中間所有行

    #,/part/:從第#行到符合part條件的第一行中間的所有行

    d.步進表示

    ~:1~2代表奇數行

       2~2代表偶數行   (#1~#2說白了就是選取從#1開始每隔#2-1行的所有行)

      3.編輯命令

    d:刪除匹配行

    p:顯示模式空間的內容

    i /test:在行前面插入test文本內容,支持使用\n進行多行插入

    a /test:在行后面插入test文本內容,支持使用\n進行多行插入

    c /test:替換行為test文本,也支持使用多行替換

    w /path/to/somefile:保存匹配的行內容至指定文件中

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

    =:將模式空間行的行數打印出來

    ?。耗J娇臻g匹配的行進行取反處理

    基本使用方式如下所例:

  1.顯示文件f2中以user[0-9]命名的用戶

[root@localhost testdir]# cat f2
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     ...

[root@localhost testdir]# sed -n '/user[0-9]/p' f2
    48	user1:x:1100:1102:dafeige:/home:/bin/bash
    49	user2:x:1101:1101:dafeige:/home:/bin/bash

  2.使用管道連接并在f2文件的第46行上,下加入“wohenshuai”的文本內容。第三個命令是將第46行內容替換成“wohenshuai”

[root@localhost testdir]# sed -n '46p' f2|sed 'a wohenshuai'
    46	harry:x:1004:1005::/home/harry:/bin/bash
wohenshuai
[root@localhost testdir]# sed -n '46p' f2|sed 'i wohenshuai'
wohenshuai
    46	harry:x:1004:1005::/home/harry:/bin/bash
[root@localhost testdir]# sed -n '46p' f2|sed 'c wohenshuai'
wohenshuai

  3.取反的使用示例,這里使用!將包含非‘echo’的行顯示打印

[root@localhost testdir]# cat f1
#!/bin/bash
echo "mike a temp file"
echo
mktemp /temp/test.XXXX
[root@localhost testdir]# sed -n '/echo/!p' f1
#!/bin/bash
mktemp /temp/test.XXXX

  4.多點操作-e的使用:在xiaojiji文件選取含有root或兩位數的行,顯示打印

[root@localhost testdir]# sed -n -e '/\<[[:digit:]][[:digit:]]\>/p' -e '/root/p' xiaojiji 
root:x:0:0:root:/root:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/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
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

    4.行編輯內容的查找替換(比較常用)

    ‘s///’或‘s@@@’或‘s###’前兩個//或@@或##之間為查詢的匹配內容,后兩個符號之間為替換內容,如果想要在原內容上追加內容,可以使用&表示查找的原內容。舉例說明:

 將文件f1中所有以#打頭的行前面加上一個$符號:

[root@localhost testdir]# cat f1
#!/bin/bash
echo "mike a temp file"
echo
mktemp /temp/test.XXXX
[root@localhost testdir]# sed 's/^#/$&/' f1
$#!/bin/bash
echo "mike a temp file"
echo
mktemp /temp/test.XXXX

其中地址可以使用's@^#@$&@'或's#^\##$&#'來代替。


sed存在高級模式為h,H,G,g,x,n,D,d等,涉及到模式空間下的保持空間內容,這里不做敘述,相關內容在pdf文件中。


    二.vim編輯器的強大功能

    與nano文本編輯不同,vim作為vi的強化版文本編輯器,有著強大但眾多的編輯功能,使用便利但由于編輯方式眾多,不如nano簡潔,所以對于初學者無法短期內熟練掌握其所有編輯方式。其操作模式分為命令模式、編輯模式、擴展命令模式三大種。其模式的轉換由鍵盤上的固定字符執行:Esc、:、i、v。其轉換關系如下圖:

1470665805965474.jpg

      1.vim打開文件的方式

    vim編輯器可以使用‘+’選項指定一些特定的方式進入文本模式:

    vim [option]… File…

    [option]:

    +#:進入文本讓光標停留在第#行行首

    +/pattern:進入文本讓光標停留在第一個匹配到pattern行的行首

    +:進入文本光標停留在最后一行行首

    -d file1 file2:對比file1與file2兩個文件內容

    -m:只讀打開文件

    -e:直接進入擴展命令模式


    vim編輯器支持打開多個文件,vim file1 file2 file3….。并按照從左到右順序打開,切換到擴展命令模式‘:’輸入特定內容可實現文件內容的切換操作,如下所示:

    :next    顯示下一個文件內容

    :prev    顯示上一個文件內容

    :first   顯示第一個文件內容

    :last    顯示最后一個文件內容

    :wall    保存所有內容

    :qall    退出所有文件

    :wqall   保存并退出所有文件

    

      2.命令模式下常用的編輯命令

    當不加入選項進入vim編輯模式時,光標默認停留在首行行首上。這時鍵盤上的字母并不能編輯內容,而分別帶有特殊意義。比如h,j,k,l代表控制光標的上下左右移動,效果等同于方向鍵。這里選取比較常見并且方便的由命令模式編輯文件的特殊字符:

      刪除命令d:

    d$/D:刪除當前行行標至行尾所有內容

    dd:刪除行標所在當前行

    d0:刪除當前行行首至行標所有內容

    d^:刪除當前行非空格行首至行標內容

    dw,de,db:刪除當前光標單詞的操作。db表示刪除行標所在處單詞的詞首至光標的字符,dw,de表示刪除光標至詞尾的字符

      復制命令y:

    y$:復制光標至行尾內容

    y0:復制行首至光標內容

    y^:復制非空格行首至光標內容

    Y/yy:復制當前行

      粘貼命令p:

    p:粘貼至當前行標下方

    P:粘貼至當前行標上方

    命令模式中粘貼多次字符的方式:100[i]mcgee[Esc]  其中[]內代表操作字符,[i]切換至編輯模式輸入需要重復粘貼的字符,100為粘貼次數,mcgee為粘貼的字符,[Esc]鍵返回命令模式并執行重復粘貼操作。

      改變命令c:

    c:修改后切換至編輯模式

    cc:刪除當前行并切換至編輯模式

    C/c$:刪除行標至當前行尾內容并切換至編輯模式

    c0:刪除行首至行標內容并切換至編輯模式

    c^:刪除非空格行首至行標的內容并切換至編輯模式

    個人常用快速跳轉光標操作(必須在命令模式下):G(跳轉至文本最后行)、gg(跳轉至文本首行)、0(跳轉至當前行行首)、^(跳轉至當前行非空格行首)、$(跳轉至當前行行尾)、ctrl+左右(單詞跳轉)。

      恢復操作u:

    u:恢復之前內容。(這個功能非常重要,如果發生誤操作更改,使用u即可恢復之前一次操作的文本內容了)

    U:撤銷當前光標所在行的所有更改


      2.擴展模式的常用操作

    ‘:’代表切換至擴展模式,比如:q,:w,:wq!等代表保存文件以及退出與強制退出等。其實擴展命令模式看來有點像輸入命令,Enter鍵入后執行對文本內容的操作,所以可以根據正則表達式的索引范圍對特定字符的匹配行進行查找,找到后可執行修改操作。比如:

    :s///(@@@)(###)就與sed命令中的s///查找更改的作用一樣。舉例如下:

  文件f1內容如下:

#!/bin/bash
echo "mike a temp file"
echo
mktemp /temp/test.XXXX
~

  找尋文件中的bash,并將bash替換成csh

:s/bash/csh/g

 于是文件f1內容變為如下:

#!/bin/csh
echo "mike a temp file"
echo
mktemp /temp/test.XXXX

  默認情況下只匹配每行的第一個匹配字符,其中g代表匹配全局,還有i,代表忽略大小寫字符匹配

    在擴展模式中經常使用查找匹配的相關功能,下面介紹一些擴展模式地址匹配的界定符號:

    #(數字):指定#行

    #1,#2:指定#1至#2之間行         比如2,5  指2-5行

    #1,+#2:指定從#1至#1+#2之間行   比如2,+3 指2-5行

    .:代表當前行

    $:代表最后一行,$-1代表倒數第二行,以此類推$-n…代表倒數第n-1行

    %:代表全局,整個文本

    /pat1/,/pat2/:第一個匹配/pat1/的行至第一個匹配/pat2/的行

    /pat/支持使用正則表達式,可以與上述符號使用,如/path/,$代表匹配pat的第一行至最后一行

    這些地址界定在擴展模式的使用需要遵循固定格式,要在前面使用,后面跟上輸出命令,比如:

  比如f2文件內容部分如下:

    33  saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin
    34  libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
    35  pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    36  gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    37  gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
    38  avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    39  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    40  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    41  ntp:x:38:38::/etc/ntp:/sbin/nologin

  前面是個人使用echo重定向輸入的行號,便于觀察者理解?,F在使用擴展模式刪除36-39行的所有字母字符,如下操作:

:36,39s/[[:alpha:]]*//g

  于是文本內容變為:

    33  saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin 
    34  libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin 
    35  pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin 
    36  ::42:42::///:// 
    37  --::989:984:://--/:// 
    38  ::70:70: /- :///-:// 
    39  ::74:74:- :///:// 
    40  postfix:x:89:89::/var/spool/postfix:/sbin/nologin 
    41  ntp:x:38:38::/etc/ntp:/sbin/nologin 
    42  tcpdump:x:72:72::/:/sbin/nologin

    

      3.可視化模式VISUAL

     命令模式下v鍵切換至visual模式,結合d,y,p等命令,可以對選定的塊進行操作,舉例說明:  

  v鍵進入可視化模式,還是使用f2文件:  

~                                                                                              
~                                                                                              
-- VISUAL --

  光標選定塊如圖:

1470734501821819.jpg    

  按d刪除,如下:

1470734581951725.jpg

  這里需要注意的是光標停留位置很重要,以這個位置為分隔符,可以向前或者后面內容進行移動,達到隨意選取的功能。

    

    

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

(0)
mcgeewangmcgeewang
上一篇 2016-08-10
下一篇 2016-08-10

相關推薦

  • bond的常見使用方式和問題

    bond的簡單建立于事項

    2017-09-09
  • 加密和解密技術基礎(01) ~ 105分鐘

    加密和解密技術基礎(01) ~ 105分鐘 講課思路: 互聯網通信機制 –> 網絡協議模式(osi,tcp/ip模型) –> 數據通信安全  à 數據加密 –> 加密算法 –> OpenSSL是什么 à SSL通信原理 –> CA –> OpenSSL命令用法 à CA 自簽及簽證演示 1.1 &nbs…

    Linux干貨 2016-09-19
  • systemd和systemctl

    systemd:      POTS–>boot Sequence(BIOS)–>Bootloader(MBR)–>kernel(ramdisk)–>rootfs(swithroot)–>/sbin/init    &n…

    Linux干貨 2016-09-22
  • 磁盤陣列RAID

    磁盤陣列RAID 什么是RAID RAID的全稱是Redundant Array of Inexpensive Disks 可以釋義為 廉價磁盤冗余陣列,后來的RAID里的字母I被認為是Independent,即獨立的磁盤冗余陣列。 RAID的作用 由于服務器中磁盤讀寫率太大,所以磁盤經常損壞,raid可以讓壞了一塊磁盤時,服務器不至于巖機。當然這只是其中的…

    Linux干貨 2017-06-18
  • 從Linux小白到大?!c狼共舞的日子5

    馬哥教育網絡班21期+第5周課程練習 1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行。 [root@localhost ~]# grep '^[[:space:]]\+' /boot/grub/grub.conf 2、顯示/etc/rc.d/rc.sysinit文件中以…

    Linux干貨 2016-08-31
  • 初識MySQL(一)

        數據庫(DATABASES)      數據庫是一個單位或是一個應用領域的通用數據處理系統,存儲有企業和事業部門、團體和個人的有關數據的集合,該集合中數據是從全局觀點出發建立的,按一定的數據模型進行組織、描述和存儲。其結構基于數據間的自然聯系,從而可提供一切必要的存取路徑,且數據不…

    Linux干貨 2015-08-24

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-12 09:11

    關于sed和vim總結的很好,很詳細,sed可以有一些示例,這樣看起來會更豐滿哦。

欧美性久久久久