網站首頁 編程語言 正文
基礎知識
- 行編輯工具: 一行一行處理文件內容,例如:sed
- 全屏編輯工具:一次性將文件所有內容加載到內存中,例如:vi、vim、nano
sed編輯器: Stream Editor
工作原理:
逐行處理文件內容,一次讀取一行內容到模式空間處理。由此反復,知道最后一行處理完成。
# 處理:可以是輸出到屏幕,也可以是文本的修改替換等操作
# 模式空間:就是一塊內存空間
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' #!表示除了這些行,其他的都打印
原文鏈接:https://www.cnblogs.com/heyongshen/archive/2022/07/11/16466749.html
相關推薦
- 2022-11-08 H5頁面 禁止微信分享轉發按鈕
- 2022-12-06 React?Hook中的useEffecfa函數的使用小結_React
- 2022-12-04 go高并發時append方法偶現錯誤解決分析_Golang
- 2022-10-16 QT實現簡單TCP通信_C 語言
- 2022-06-27 ABP引入SqlSugar框架的簡單版創建使用_實用技巧
- 2022-12-14 正則表達式(?=)正向先行斷言實戰案例_正則表達式
- 2022-09-26 ASP.NET?Core?6最小API中使用日志和DI示例詳解_ASP.NET
- 2022-06-08 golang操作rocketmq的示例代碼_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支