文本處理:三劍客之sed及vim編輯器

一、sed的用法詳解

sed作為Linux的第二招,有著非常強大的文本處理功能。sed是一種在線編輯器、行編輯器,每次處理一行內容。在處理時,sed首先將行放在內存中的一塊臨時緩沖區,通常配叫做模式空間(pattern space)。如果模式空間的行符合sed的匹配模式則將該行處理后送到標準輸出,如果不匹配則不做任何改動送到標準輸出。模式空間中一般情況下只會有一行的內容(用到保持空間的高級用法可能會有多行),所以非常適合處理大的文本。sed和grep雖然都是流式文本處理工具,grep主要用來檢索條件關鍵字,sed則是根據檢索匹配處理文本。

1470886429849697.jpg

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,),},箭頭等

突出顯示的文字可以被刪除,復制,變更,過濾,搜索/替換等

如:要給連續的行前加注釋

1470893517753275.png

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

(0)
nieda_linuxnieda_linux
上一篇 2016-08-12
下一篇 2016-08-12

相關推薦

  • shell腳本1

    shell腳本基礎 shell腳本: 包含一些命令或聲明,并符合一定格式的文本文件 格式要求:首行shebang機制 #!/bin/bash #!/usr/bin/python #!/usr/bin/perl shell腳本的用途有: 自動化常用命令 執行系統管理和故障排除 創建簡單的應用程序 處理文本或文件 創建shell腳本 第一步:使用文本編輯器來創建…

    2017-08-05
  • 虛擬機的三種網絡模式

    前言     虛擬機的網絡模式,是環境部署時的重要環節。不同的運行環境對網絡的要求也是不用的,本章節重點介紹虛擬機的三種網絡模式、以及他們之間的區別 虛擬機網絡模式      無論是vmware,virtual box,virtual pc等虛擬機軟件,一般來說,虛擬機有三種網絡模式: 1.橋接 2…

    2017-07-11
  • 馬哥教育網絡班21期+第9周課程練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; [root@localhost test]# ./exercise3.sh  be eable to login us…

    Linux干貨 2016-08-05
  • 第三章 Linux文件系統初步

    用戶界面:      可分為兩種GUI和CLI         GUI(Graphical User Interface,簡稱 GUI,又稱圖形用戶接口)是指采用圖形方式顯示的計算機操作用戶界面。 GNOME(英語發音:/ɡ?no?m/或英語發音:/…

    Linux干貨 2016-06-03
  • 馬哥教育網絡班22期+第四周課程練習

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限 [root@localhost ~]# cp -rf /etc/skel/ /home/tuser1 &> /dev/null [root@localhost ~]# chmod -R go= /home/tus…

    Linux干貨 2016-09-07
  • LINUX課堂筆記(第二周)

    2018.03.12 rpm httpd*** service httpd start ab 模仿用戶訪問 cat /var/log/httpd/access_log curl 訪問web服務 rev 字符顛倒顯示 sort ? -r 執行反方向(由上至下)整理 ? -R 隨機排序 ? -n 執行按數字大小整理 ? -f 選項忽略(fold)字符串中的字符大…

    Linux干貨 2018-03-17

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-12 12:22

    文章結構清晰,有理有據,圖文并貌。

欧美性久久久久