Linux sed工具的使用

来源:https://www.cnblogs.com/heyongshen/archive/2022/07/11/16466749.html
-Advertisement-
Play Games

基礎知識 - 行編輯工具: 一行一行處理文件內容 - 全屏編輯工具:一次性將文件所有內容載入到記憶體中 sed編輯器: Stream Editor 工作原理: 逐行處理文件內容,一次讀取一行內容到模式空間處理。由此反覆,知道最後一行處理完成。 # 處理:可以是輸出到屏幕,也可以是文本的修改替換等操作 ...


基礎知識

- 行編輯工具: 一行一行處理文件內容,例如:sed

- 全屏編輯工具:一次性將文件所有內容載入到記憶體中,例如:vi、vim、nano

sed編輯器: Stream Editor

工作原理:

逐行處理文件內容,一次讀取一行內容到模式空間處理。由此反覆,知道最後一行處理完成。

# 處理:可以是輸出到屏幕,也可以是文本的修改替換等操作
# 模式空間:就是一塊記憶體空間

image

sed的基本用法

sed的命令格式

sed [option] 'script' [inputfile]

#script: sed自身的腳本,sed自身語法的一種腳本
#inputfile: 文件,如果不寫文件就對標準輸入的內容進行處理

sed實現自動列印功能(最基本用法)


sed '' filename

#''裡面的腳本內容不能省略
#不輸入腳本就是讀入什麼就預設列印什麼 --- sed內置了自動列印的功能

sed選項

-n:關閉sed的自動列印

-e:多點編輯(一次更改多個內容)

-r,-E:使用正則表達式

-i.bak 先把文件做個備份然後再改

-s:將多個文件視為單獨的文件

sed的腳本格式

sed腳本:由位置(地址)和指令組合而成

sed腳本的地址格式

  • 空地址

  • 單地址

  • 地址範圍

  • 步進

空地址:

表示對全文進行處理

單地址:

表示處理指定的行。

#指定的行可以通過數字直接指定,也支持正則表達式匹配。
#寫正則表達式的格式:/pattern/
地址範圍:

(n,m):表示從n行開始,到m行結束這個範圍的內容。

#地址範圍也可以使用正則表達式表示: /pat1/,/pat2/ (第一個正則表達式之後到下一個正則表達式中間的內容)

sed腳本的指令

 p --- 內容列印

 Ip --- 忽略大小寫輸出

 d --- 把模式空間內容刪除掉,不再自動列印了

 a --- 再某些行後面加內容

 i --- 再某些行前面加內容

 c --- 替換某一行的內容

 w --- file 另存為指定文件

 r --- 把一個文件內容讀到當前匹配到的行中

 = --- 某一行前面添加行號

 ! --- 除了某一行的意思

 q --- 結束或退出sed
 
#搜索替代
s/pattern/string/修飾符 --- 查找替換,支持使用其它分隔符

範例

#sed基本用法:自動列印
#查看某個文件的文本內容
sed '' dir.sh

#列印指定行的內容
sed -n '3p' /etc/passwd #需要使用-n關閉自動列印,因為如果使用了自動列印會輸出所有內容,-p:列印匹配到的內容

#列印出包含root的行
sed -n '/root/p' /etc/passwd

#列印從第三行到第六行的內容:
sed -n '3,6p' /etc/passwd

#列印以r開頭到以g開頭的行的中間那些行 
sed -n '/^r/,/^g/p' /etc/passwd #找到了第一個滿足條件的範圍後不會停止,還會繼續往下麵找。

#列印奇數行
sed -n '1~2p' /etc/passwd #從1開始,每次步進2

sed工具的核心用法:搜索替代

#搜索替代的格式:
s/pattern/string/修飾符  #支持使用其它分隔符,可以是其它形式:s@@@,s###
s/模式/替代的字元串/修飾符

搜索替代的修飾符:

g --- 行內全局替換
p --- 顯示替換成功的行
w --- /PATH/FILE 將替換成功的行保存至文件中
I,i --- 忽略大小寫

# &符號:待變前面搜索出來的內容。 相當於一個變數,保存搜索出來的內容

正則表達式的分組(後項引用)

小括弧實現分組,後面要表示第幾個分組的內容就用 \num(第幾個小括弧裡面的內容)  #分組實現把一個文件的一行切成多塊,保留其中之一

範例

#sed分組的實現 --- 分組使用的是小括弧(直接小括弧是擴展正則表達式,不加r參數用的是基本正則表達式)
echo abc123xyz | sed -r 's/(abc)(123)(xyz)/\1/' #輸出abc 值留下了第一個分組
#搜索替換和& --給前面特定的內容後面加內容
sed -nr 's/r..t/&er/gp' /etc/passwd #給搜索到的內容加上er結尾
#獲取分區利用率

#獲取指定網卡的ip地址:
ifconfig ens33 | sed -nr '2s/.*inet ([0-9.]+) .*/\1/p'
#行首一直到inet 中間空格
#一個以上的數字或點 空格 一直到結尾

ifconfig ens33 | sed -rn '2s/(.*inet )([0-9].*)(netmask.*)/\2/p'
#行首一直到inet,中間空格
#數字
#取基名和目錄名
echo "/etc/netplan/01-netcfg" | sed -nr 's#.*\/([^/]+)#\1#p'  #結果為 01-netcfg
#從任意字元開始到以斜杠結尾,然後以非斜杠開頭的內容
#使用sed將selinux改為disabled
sed -r -i.bak '/^SELINUX=/s/(SELINUX=).*/\1disabled/' /etc/selinux/config
# 取文件的首碼和尾碼
echo a.b.c.tar | sed -nr 's/(.*)\.([^.]+)$/\2/p'
#將非#開頭的行加#
sed -rn 's/^[^#]/#&/p' /etc/fstab 
或
#sed -rn 's/^[^#](.*)/#\1/p' /etc/fstab

#將#開頭的行刪除#
#sed -ri.bak '/^#/s/^#//' /etc/fstab

#刪除指定的行
cat /etc/passwd | sed '/tom/d' #刪除含有root的行
cat /etc/passwd | sed '4-10d' #刪除第四行到第十行的內容

sed編輯器的高級用法

相關概念

模式空間:pattern space,存放sed需要處理哪一行數據(一個緩衝區)

保持空間:Hold Space,臨時存放模式空間中的數據(一個臨時空間)

和兩個空間相關的指令

#模式空間內容-->保持空間 小寫覆蓋,大寫追加
h 模式空間的內容覆蓋到保持空間
H 模式空間的內容追加到保持空間(內容追加)

#保持空間內容--->模式空間
g 保持空間數據覆蓋模式空間
G 保持空間內容追加模式空間

#內容互換
x 兩者內容互換

#匹配到的下一行內容--->模式空間
n 匹配行的下一行覆蓋至模式空間
N 匹配行的下一行追加至模式空間

#刪除
d 清空模式空間
D 刪除模式空間第一行

sed命令使用變數

#因為sed的腳本使用單引號括起來的,單引號屬於強引用。所見即所得。
#例如:列印含有root的行
name=root
cat /etc/passwd | sed -nr "/$name/p" #如果裡面的內容本來就帶雙引號的,所以就不能再在外面使用雙引號。
解決方法;cat /etc/passwd | sed -nr '/'$name'/p' #再加一個單引號把變數括起來 把'/'和'/p'成對了,變數空出來了
#多點編輯並調用變數
#使用變數的方式修改httpd的配置文件 servername和port 
cat /etc/httpd/conf/httpd.conf | sed -nr -e  's/^(Listen) 80/\1 '$port'/p' -re "/#ServerName /c ServerName= `hostname`:$port/p"
#或者:
cat /etc/httpd/conf/httpd.conf | sed -nr -e  's/^(Listen) 80/\1 '$port'/p' -re '/#ServerName /c ServerName= '$(hostname)':'$port'/p' # $(command)
#把包含ServerName的這一行替換成: ServerName: 主機名:埠

範例

#sed實現修改預設的網卡名
 cat /etc/default/grub | sed -nr 's/^(GRUB_CMDLINE_LINUX=.*)"$/\1  net.ifnames=0"/p'
#列印偶數行
seq 10 | sed -n 'n;p' #n:讀取到的行的下一行 
#比如首先讀取到的是第一行,因為有n,所以就以讀到的內容的下一行內容覆蓋當前讀到的內容到模式空間,所以第一次輸出2.

seq 10 | sed -n '2~2p' #使用步進的方式實現

seq 10 | sed -n '1~2!p' #!表示除了這些行,其他的都列印

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.封裝的概念 (1)程式的設計需要“高內聚,低耦合”,高內聚就是類的內部數據操作細節自己完成,不允許外部干涉;低耦合僅暴露少量的方法給外部使用。 點擊查看代碼 package com.Tang.oop.demo04; import com.Tang.oop.demo03.Person; publi ...
  • Python設計模式-創建型:單例模式和工廠模式家族 知識點: 單例模式概念及一般實現 單例模式的裝飾器實現 簡單工廠模式 抽象工廠模式 單例模式(singleton) 所謂單例模式,也就是說不管什麼時候我們要確保只有一個對象實例存在。 很多情況下,整個系統中只需要存在一個對象,所有的信息都從這個對 ...
  • 為大家介紹在CentOS操作系統中安裝docker的過程,linux其他發行版本安裝docker方法可以參考官方提供的安裝教程 一、前置要求 首先確定你是CentOS7及以上版本,按照官方文檔說明目前安裝docker ce最低的操作系統版本要求就是CentOS7,CentOS6不再被支持。(2022 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 第三回 萬文疑謀生思緒 璃月港口見清玉 雲溪愣了下,在他的認知中,神之眼正常而言不會有黑色的存在,就像在實數的體系內不會有i一樣,他搖了搖頭。而紀存初的眼中有閃過一次迷茫和失望,很快恢復過來,笑道:“算了,反正也只是個坊間傳說而已,對了,小子,有興趣入我萬文集舍麽?” 話題跳轉的如此之快,讓雲溪有點 ...
  • yum工具的使用 yum倉庫管理 ###1. yum本地倉庫 掛載鏡像 [root@lnh ~]# cd /etc/yum.repos.d/ [root@lnh yum.repos.d]# ls CentOS-Stream-AppStream.repo CentOS-Stream-RealTime. ...
  • 一 Linux操作系統和Shell 簡介 操作系統(Operating Systems, OS)實際上是一種電腦的軟、硬體資源的進展管理調度的系統級軟體,它的主體是內核(Kernel),其主要負責進程管理、記憶體管理、文件管理和外設管理等功能,而它也向外界提供了內核的介面即系統調用(System C ...
  • 目錄 一、前景回顧 二、實現鍵盤輸入的中斷函數 三、編寫鍵盤驅動 四、實現環形輸入緩衝區 五、運行測試 一、前景回顧 上一回我們完成了鎖的實現,並且利用鎖優化了終端輸出函數。這一回我們來實現鍵盤的輸入,為後面的用戶交互功能打好基礎。 二、實現鍵盤輸入的中斷函數 首先我們需要知道鍵盤是屬於外設,所以對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...