Linux sed命令

2022-01-21 大數據技術AI

Linux sed 命令是利用腳本來處理文本文件。

sed 可依照腳本的指令來處理、編輯文本文件。

Sed 主要用來自動編輯一個或多個文件、簡化對文件的反覆操作、編寫轉換程序等。

1 語法
 sed [-hnV][-e<script>][-f<script文件>][文本文件]

1.1 參數說明

-e<script>或--expression=<script> 以選項中指定的script來處理輸入的文本文件。

-f<script文件>或--file=<script文件> 以選項中指定的script文件來處理輸入的文本文件。

-h或--help 顯示幫助。

-n或--quiet或--silent 僅顯示script處理後的結果。

-V或--version 顯示版本信息。

1.2 動作說明

a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~

c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!

d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;

i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);

p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~

s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

2、以行為單位的新增/刪除

2.1 將 passwd 複製一份, 並將他內容列出並且列印行號,同時,請將第 2~5 行刪除!

 [root@hadoop01 root]$   nl passwd
      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 halt:x:7:0:halt:/sbin:/sbin/halt
      5 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      7 nobody:x:99:99:Nobody:/:/sbin/nologin
      8 sssd:x:997:995:User for sssd:/:/sbin/nologin
      9 polkitd:x:996:994:User for polkitd:/:/sbin/nologin
    10 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    11 abrt:x:173:173::/etc/abrt:/sbin/nologin
    12 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
    13 unbound:x:994:992:Unbound DNS resolver:/etc/unbound:/sbin/nologin
    14 memcached:x:993:991:Memcached daemon:/run/memcached:/sbin/nologin
    15 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
 
 
 [root@hadoop01 root]$ nl passwd | sed '2,5 d'
      1 root:x:0:0:root:/root:/bin/bash
      6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      7 nobody:x:99:99:Nobody:/:/sbin/nologin
      8 sssd:x:997:995:User for sssd:/:/sbin/nologin
      9 polkitd:x:996:994:User for polkitd:/:/sbin/nologin
    10 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    11 abrt:x:173:173::/etc/abrt:/sbin/nologin
    12 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
    13 unbound:x:994:992:Unbound DNS resolver:/etc/unbound:/sbin/nologin
    14 memcached:x:993:991:Memcached daemon:/run/memcached:/sbin/nologin
    15 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

sed 的動作為 '2,5d' ,那個 d 就是刪除!因為 2-5 行給他刪除了,所以顯示的數據就沒有 2-5 行另外,注意一下,原本應該是要下達 sed -e 才對,沒有 -e 也行!同時也要注意的是, sed 後面接的動作,請務必以 '' 兩個單引號括住喔!2.2 只要刪除第 2 行
 [root@hadoop01 root]$   nl passwd | sed '2d'
      1 root:x:0:0:root:/root:/bin/bash
      3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
      4 halt:x:7:0:halt:/sbin:/sbin/halt
      5 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      7 nobody:x:99:99:Nobody:/:/sbin/nologin
      8 sssd:x:997:995:User for sssd:/:/sbin/nologin
      9 polkitd:x:996:994:User for polkitd:/:/sbin/nologin
    10 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    11 abrt:x:173:173::/etc/abrt:/sbin/nologin
    12 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
    13 unbound:x:994:992:Unbound DNS resolver:/etc/unbound:/sbin/nologin
    14 memcached:x:993:991:Memcached daemon:/run/memcached:/sbin/nologin
    15 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

2.3 在第二行後(亦即是加在第三行)加上『hadoop』字樣!
 [root@hadoop01 root]$ nl passwd | sed '2a hadoop'
      1 root:x:0:0:root:/root:/bin/bash
      2 bin:x:1:1:bin:/bin:/sbin/nologin
 hadoop
      3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 

2.4 在第二行前
 [root@hadoop01 root]$ nl passwd | sed '2i hadoop'
      1 root:x:0:0:root:/root:/bin/bash
 hadoop
      2 bin:x:1:1:bin:/bin:/sbin/nologin
      3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

2.5 增加兩行以上,在第二行後面加入兩行字
 [root@hadoop01 root]$ nl passwd | sed '2a hadoop \
 > scala'
      1 root:x:0:0:root:/root:/bin/bash
      2 bin:x:1:1:bin:/bin:/sbin/nologin
 hadoop
 scala
      3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 

每一行之間都必須要以反斜槓『 \ 』來進行新行的添加喔!所以,上面的例子中,我們可以發現在第一行的最後面就有 \ 存在。

3、以行為單位的替換與顯示3.1 將第2-5行的內容取代成為『hello world』
 
 [root@hadoop01 root]$ nl passwd | sed '2,5c hello world'
      1 root:x:0:0:root:/root:/bin/bash
 hello world
      6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 

4、數據的搜尋並顯示4.1 root關鍵字的行
 [root@hadoop01 root]$ nl passwd | sed '/root/p'
      1 root:x:0:0:root:/root:/bin/bash
      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 halt:x:7:0:halt:/sbin:/sbin/halt
      5 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      7 nobody:x:99:99:Nobody:/:/sbin/nologin
      8 sssd:x:997:995:User for sssd:/:/sbin/nologin
      9 polkitd:x:996:994:User for polkitd:/:/sbin/nologin
    10 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    11 abrt:x:173:173::/etc/abrt:/sbin/nologin
    12 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
    13 unbound:x:994:992:Unbound DNS resolver:/etc/unbound:/sbin/nologin
    14 memcached:x:993:991:Memcached daemon:/run/memcached:/sbin/nologin
    15 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

如果root找到,除了輸出所有行,還會輸出匹配行。

使用-n的時候將只列印包含模板的行

 [root@hadoop01 root]$ nl passwd | sed -n '/root/p'
      1 root:x:0:0:root:/root:/bin/bash

5、數據的搜尋並刪除5.1 刪除/passwd所有包含root的行,其他行輸出
 [root@hadoop01 root]$ nl passwd | sed '/root/d'
      2 bin:x:1:1:bin:/bin:/sbin/nologin

6、數據的搜尋並執行命令6.1 搜索passwd,找到root對應的行,執行後面花括號中的一組命令,每個命令之間用分號分隔,這裡把root替換為hadoop,再輸出這行:

p:列印所有的;

q:列印匹配的

 [root@hadoop01 root]$ nl passwd | sed '/root/{s/root/hadoop/;p;q;}'
      1 hadoop:x:0:0:root:/root:/bin/bash
      1 hadoop:x:0:0:root:/root:/bin/bash

 [root@hadoop01 root]$ nl passwd | sed '/root/{s/root/hadoop/;p}'
      1 hadoop:x:0:0:root:/root:/bin/bash
      1 hadoop: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
      ...

7、數據的搜尋並替換

除了整行的處理模式之外, sed 還可以用行為單位進行部分數據的搜尋並取代。基本上 sed 的搜尋與替代的與 vi 相當的類似

 sed 's/要被取代的字串/新的字串/g'

7.0 只要第一行的數字部分
 [root@hadoop01 root]$ nl passwd | sed -n '/root/p'
      1 root:x:0:0:root:/root:/bin/bash

7.1 刪除第一行,數字前半部分
 [root@hadoop01 root]$ nl passwd | sed -n '/root/p' | sed 's/^.*x://g'
 0:0:root:/root:/bin/bash

s/後面的字符串是包含的關係

7.2 刪除第一行,數字後半部分
 [root@hadoop01 root]$ nl passwd | sed -n '/root/p' | sed 's/^.*x://g' | sed 's/:root.*$//g'
 0:0

8、多點編輯8.1 一條sed命令,刪除passwd第四行到末尾的數據,並把root替換為hadoop
 [root@hadoop01 root]$ nl passwd | sed -e '4,$d'
      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
 
 
 [root@hadoop01 root]$ nl passwd | sed -e '4,$d' -e 's/sbin/hadoop/g'
      1 root:x:0:0:root:/root:/bin/bash
      2 bin:x:1:1:bin:/bin:/hadoop/nologin
      3 daemon:x:2:2:daemon:/hadoop:/hadoop/nologin

-e表示多點編輯,第一個編輯命令刪除passwd第三行到末尾的數據,第二條命令搜索root替換為hadoop

9、直接修改文件內容(危險動作)9.1 sed 將 passwd 內每一行結尾若為 nologin 則換成 hadoop
 [root@hadoop01 root]$ sed -i 's/nologin$/hadoop/g' passwd
 [root@hadoop01 root]$ nl passwd
      1 root:x:0:0:root:/root:/bin/bash
      2 bin:x:1:1:bin:/bin:/sbin/hadoop
      3 daemon:x:2:2:daemon:/sbin:/sbin/hadoop
      4 halt:x:7:0:halt:/sbin:/sbin/halt
      5 mail:x:8:12:mail:/var/spool/mail:/sbin/hadoop
      6 ftp:x:14:50:FTP User:/var/ftp:/sbin/hadoop
      7 nobody:x:99:99:Nobody:/:/sbin/hadoop
      8 sssd:x:997:995:User for sssd:/:/sbin/hadoop
      9 polkitd:x:996:994:User for polkitd:/:/sbin/hadoop
    10 apache:x:48:48:Apache:/usr/share/httpd:/sbin/hadoop
 ...

9.2 sed 將 passwd 內每二行替換為 --hello world
 [root@hadoop01 root]$ sed -i '2c --hello world' passwd
 [root@hadoop01 root]$ nl passwd
      1 root:x:0:0:root:/root:/bin/bash
      2 --hello world
      3 daemon:x:2:2:daemon:/sbin:/sbin/hadoop
      4 halt:x:7:0:halt:/sbin:/sbin/halt
      5 mail:x:8:12:mail:/var/spool/mail:/sbin/hadoop

相關焦點

  • linux sed 命令
    sed命令整體可以幹嘛總體而言,sed命令可以對文本進行查找、刪除、插入、替換等操作。它跟vim或者vi命令最大的去區別是,後者只能通過人工交互的方式,對文本進行處理。而很多時候,我們希望腳本自動化的進行文本處理,那麼sed無疑是我們的好幫手命令簡介sed OPTIONS [SCRIPT] [INPUTFILE...]
  • Linux常用命令 - sed
    使用 sed 搜索和替換文本的一般形式如下:sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE-i 將其輸出寫入標準輸出seds 替代命令,可能是 sed 中使用最多的命令-/分隔符字符。
  • Linux 三劍客 Awk、Sed、Grep 命令詳解
    8  redhatsed -e '2,6d' -e 's/linux centos6.8/Linux Centos6.8/' testthis is a test fileLinux Centos6.8redhat#如果兩條命令功能一樣,那麼就需要用到下面的參數sed --expression='s/linux centos6.8
  • linux文本處理三劍客之sed增刪改查
    收錄於話題 #linux 「sed(stream editor, 流編輯器)是linux下非常強大的非交互式的文本編輯器,主要功能是對文本的每一行數據進行匹配後操作,比如按行、按欄位
  • 一些命令行小技巧:wc、sort、sed 和 tr | Linux 中國
    讓我們來看看一些命令行實用工具,當你熱衷於終端而不是 GUI 時,它們可能更順手。我們都知道在一個系統上使用終端會更高效。當你編輯和排版一個文本文件時,終端會讓你確切的感受到,生活如此簡單。本文將向你介紹 wc、sort、tr 和 sed 命令。wcwc 是一個實用工具,全稱是 「word count」。
  • LFCS 系列第一講:如何在 Linux 上使用 GNU sed 等命令來創建、編輯和操作文件
    # sed -n '/^Jun  8/ p' /var/log/messages | sed -n 1,5p請注意,在默認的情況下,sed 會列印每一行。我們可以使用 -n 選項來覆蓋這一行為並且告訴 sed 只需要列印(用 p來表示)文件(或管道)中匹配的部分(第一個命令中指定以「Jun 8」 開頭的行,第二個命令中指定一到五行)。
  • Linux必知必會sed命令教程
    -e,如果需要用 sed 對文本內容進行多種操作,則需要執行多條子命令來進行操作;-i,默認 sed 只會處理模式空間的副本內容,不會直接修改文件,如果需要修改文件,就要指定 -i 選項;-f,如果命令操作比較多時,用 -e 會有點力不從心,這時需要把多個子命令寫入腳本文件,使用 -f 選項指定執行該腳本;-r:如果需要支持擴展正則表達式,那麼需要添加
  • 如何使用Linux sed命令進行字符串替換
    Linux中sed命令功能強大,本文將詳細介紹如何使用sed命令進行字符串替換。一、基本的替換命令格式1:sed 's/原字符串/新字符串/' 文件命令格式2:sed 's/原字符串/新字符串/g' 文件這兩種命令格式的區別在於是否有個「g」。沒有「g」表示只替換第一個匹配到的字符串,有「g」表示替換所有能匹配到的字符串,「g」可以認為是「global」(全局的)的縮寫,沒有「全局的」結尾就不要替換全部,這樣就好記啦。
  • Linux 上 12 個高效的文本過濾命令
    $ man awk2、 sed 命令sed[3] 是一款過濾和轉換文本的強大的流編輯器。我們已經寫了兩篇關於 sed 的有用的文章,你可以通過這兒來了解:sed 的 man 手冊已經添加控制選項和說明:$ man sed3、 grep、 egrep、 fgrep、 rgrep 命令行這些過濾器輸出匹配指定模式的行。它們從一個文件或者標準輸入讀取行,並且輸出所有匹配的行,默認輸出到標準輸出。
  • 海量數據處理之cut、awk、sed命令詳解,數據分析必備技能,不難
    數據都存儲在文件中,文件中肉眼可見的數據無非就是各種有規則的字符的組合,比如日誌文件,小文件我們還可以認真閱讀,但是給你一個10M大小的數據文件,不亞於閱讀一本小說,更何況密密麻麻都是數據,我們可以通過cut、awk、sed這三個命令從規則文件中提取符合我們需要的數據,重要的是他們的運行速度非常的塊。
  • Linux命令之六 cut命令
    收錄於話題 #linux
  • 面試題linux命令之awk
    無論是在測試還是開發崗位的面試招聘中,都會被提問到:是否了解linux系統,經常使用linux命令有哪些,接著可能會出一道題目,找出下列文本中的哪些值
  • Linux常用命令 awk 入門基礎教程
    在使用awk命令的過程中,可以使用邏輯操作符「&&」和「||」;也可以進行簡單的數學運算,如+ 、-、、/、%、^分別表示加、減、乘、除、取餘、乘方。**awk從輸入文件或者標準輸入中讀入信息,與sed一樣,信息的讀入也是逐行讀取的。不同的是,awk命令將文本文件中的一行視為一個記錄,而將一行中的某一部分(列)作為記錄的一個欄位。
  • linux命令大全
    Linux命令大全之所以有存在的必要就是因為,linux作為非主流市場裡面的主流作業系統,不僅是免費的而且它還是一個非常優秀的作業系統,與MS-WINDOWS相比,可靠、 穩定、速度快。且擁有豐富的根據UNIX版本改進的強大功能。
  • 【Linux】常用命令之 awk 常用實例
    在使用awk命令的過程中,可以使用邏輯操作符「&&」和「||」;也可以進行簡單的數學運算,如+ 、-、、/、%、^分別表示加、減、乘、除、取餘、乘方。**awk從輸入文件或者標準輸入中讀入信息,與sed一樣,信息的讀入也是逐行讀取的。不同的是,awk命令將文本文件中的一行視為一個記錄,而將一行中的某一部分(列)作為記錄的一個欄位。
  • sed命令的基礎知識及簡單應用
    Sed是一Linux命令,全稱:Stream Editor,功能和awk類似,但是沒有awk功能強大,相對簡單,awk處理列的功能比awk差很多。Sed主要用於自動編輯一個或者多個文件,多用於腳本中對文件的處理。Sed命令對文件的進行增加、刪除、修改和查找操作,所以是學好sed命令是寫自動化腳本必須的基礎之一。
  • Linux三大劍客之sed(上)
    3.2 命令行選項完整格式調用sed:sed OPTIONS... [SCRIPT] [INPUTFILE...]sed可能被以下命令行選項調用: --version:列印版本信息。--help:列印簡要幫助信息並退出。
  • 軟體測試基礎之linux常用命令
    pwd 顯示當前所在路徑reboot:重啟命令。mkdir創建目錄命令, 語句結構:mkdir+空格+新建目錄名 ,如mkdir test;touch創建文件命令, 查找指定行語句結構: sed -n『起始行,終止行p' 文件名,如sed -n '5,10p' test.log ;也可以只查找某一行如:sed -n '10p' test.log;more、less查看相對較大的文檔
  • Linux常用命令:nslookup,lsmd5sum,uname,history等
    在linux中,文件、文件夾、驅動、命令、腳本都視為文件。9、mkpasswd此命令根據指定長度,產生一個難猜的隨機密碼。其中-l表示長度(Length)。如下圖產生15位的隨機密碼。20、uptime此命令是用來查詢linux系統負載的。系統平均負載被定義在特定時間間隔內運行隊列中的平均進程數。如果一個進程滿足以下條件,則其就會位於運行隊列中:
  • 20分鐘吃掉Linux常用命令40式
    #切換到上級目錄, linux中一個點表示當前路徑,二個點表示當前路徑上級路徑例2:cd ~ #切換到主目錄例3:cd /User/liangyun03/ # 切換到某個絕對路徑,linux中以/開頭的路徑表示絕對路徑例4:cd