sed命令入門

什麼是sed

sed是一種流處理編輯器,可以分割、查找、替換文本。
sed命令的處理流程:行處理

Created with Raphaël 2.1.0在shell中執行sed文本或管道輸入讀入到模式空間處理模式空間中的文本文件是否結束輸出結果yesno

sed命令的格式

sed [options] ‘command’ file
options(選項): -e (使用多個sed命令) ; -n(只輸出經過sed選定的行); -i(將處理結果輸出到文件);
command(命令): 行定位(正則規則) +sed命令(操作)

sed操作命令

  • p 打印
    sed -n ‘1p’ 打印第1行
  • a 追加一行
    例子:sed ‘5a ——————’在第5行後添加分隔線
    如果a命令後面跟的是空格需要轉義
    sed ‘5a \ ‘在第5行後面添加空格
  • i 插入行
    例子:sed ‘5a ——————’在第5行前插入分隔線
  • c 替換行
    例子:sed ‘5c ——————-’ 將第5行替換爲分隔線
  • d 刪除行
    sed ‘5d’ 將第5行刪除
    sed ‘^$d’ 刪除空行

  • s 替換命令
    分隔符/,#,用來將命令和正則表達式分開
    例子:
    sed ‘s:\%\’ 將行裏面第一次匹配的:替換爲%
    sed ‘s:\%\g’ 加g後表示全局替換,會替換每一個匹配的模式

sed行定位

  1. 指定行號 sed ‘x’ 或sed ‘x,y’
    例子:
    sed -n ‘2p’ /etc/passwd 打印passwd中第2行
    sed -n ‘3,4p’ /etc/passwd 打印passwd第3到4行
  2. 正則表達式 sed ‘/pattern/’或 sed ‘/pattern/,/pattern/’
    sed -n ‘/news/’ /etc/passwd 打印passwd中包含news的行
    sed -n ‘/news/,/systemd-network/’ 打印passwd中從包含news的行到包含systemd-network的行

  3. 間隔行 起始行號~間隔大小
    例子: sed -n ‘1~2p’ /etc/passwd從1行開始,每個2行打印一行

可以用nl命令顯示passwd文件的行號

$nl passwd|sed -n '1~2p'
     1  root:x:0:0:root:/root:/bin/bash
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     5  sync:x:4:65534:sync:/bin:/bin/sync
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    11  uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
    13  www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    15  list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
    17  gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
    19  systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
    21  systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
    23  syslog:x:104:108::/home/syslog:/bin/false
    25  messagebus:x:106:110::/var/run/dbus:/bin/false
    27  ntp:x:108:114::/home/ntp:/bin/false

sed高級操作

{} 多條命令

用{}括起來用;分隔
n:讀入下一行
sed -n ‘{n;p}’ /etc/passwd
結果:輸出偶數行

& 代表前面匹配的字符串

sed ‘s/root/\U&/’ /etc/passwd
將root替換爲ROOT

用()分組

\1 第一組 \2第二組 \n 第n組
sed ‘s/(^[a-z_-]+):x:([0-9]+):([0-9]+):.*$/USER:\1 UID: \2 GID:\3/’ /etc/passwd
取第一個括號、第二個括號、第三個括號裏的匹配內容
ifconfig eth0|sed -n ‘/inet /p’|sed ‘s/inet.r:([0-9.]+).$/\1/’
取ip地址

r 讀入指定文件插入到匹配行後面

sed ‘1r abc.txt’ 123.txt
在123.txt的第1行後面插入abc.txt的內容

w 將匹配行寫入指定文件

sed ‘1w abc.txt’ 123.txt
將123.txt的第1行寫入abc.txt
注意如果abc.txt已經存在,則原有的內容會被丟失。

q 退出sed

sed ‘/false/q’ /etc/passwd
匹配到模式後就執行q,退出sed

sed操作實例

取網卡eth0的ip地址

ifconfig eth0|sed -n ‘/inet/s/i.r://p’|sed ‘s/\ B.$//’

取系統內存大小

free -h|sed ‘/total/d’|sed ‘/Swap/d’|sed ‘s/Mem://’|awk ‘{print $1}’

獲取系統版本號

cat /etc/issue|sed ‘s/^([a-zA-Z]+) ([0-9.]+) (.*$)/\2/’

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章