Linux文本處理三劍客(詳解)

一、文本三劍客是什么?

1.?對于接觸過Linux操作系統的人來說,應該都聽過說Linux中的文本三劍客吧,即awk、grep、sed,也是必須要掌握的Linux命令之一,三者都是用來處理文本的,但側重點各不相同,awk功能最強大,但也最復雜。

二、文本三劍客介紹?

1. grep

?特點

  • 使用正則表達式搜索文本
  • 匹配到的文本會顯示出來并標紅
  • 使用權限是所有用戶

工作方式?

  • grep可以在一個或多個文件中檢索,如果條件中包含了空格,需要使用雙引號引起

工作結果

  • 如果搜索成功則返回為0的狀態碼?,否則為1的狀態碼

格式

grep -參數 條件 文件名參數:-i		忽略大小寫
-c		統計匹配的行數
-v		取反,不顯示匹配的行-i	
-w		匹配單詞
-E		等價于egrep,即啟用擴展正則表達式
-n		顯示行號
-rl		將指定目錄內的文件打印
-A數字		匹配行及以下n行
-B數字		匹配行及以上n行
-c數字		匹配行及上下n行
-q		靜默模式,沒有任何內容輸出,使用$?來判斷是否執行成功
-o		只顯示匹配的內容
示例
操作對象文件:/etc/passwd作用:  記錄賬戶的信息,共分為7段,使用冒號分割
意義:  賬戶名:密碼代號x: UID:GID: 注釋:家目錄:登錄的Shell
注意:  最后一段/sbin/nologin表述不允許登錄# 搜索/etc/passwd 含有root的字符串并顯示行號
[root@server ~]# grep -n "root" /etc/passwd 
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin# 搜索/etc/passwd 含有sshd的字符串并顯示行號
[root@server ~]# grep -n "sshd" /etc/passwd 
32:sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin# 匹配/bin/bash的行數,顯示行號
[root@server ~]# grep  "/bin/bash" /etc/passwd  | wc -l
22# 匹配不是/sbin/nologin的行,并顯示行號
[root@server ~]# grep -nv "/sbin/nologin" /etc/passwd # -n顯示行號 -i忽略大小寫
[root@server ~]# grep -ni "d" /etc/passwd # 匹配含有ftp行及以上3行內容
[root@server ~]# grep -nB3 "ftp" /etc/passwd
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

2.sed

介紹

sed命令是將一系列的編輯命令應用于批處理文本的理想工具。sed命令擁有非交互式和高效的特點,可以為用戶節約大量的時間。本節將介紹sed命令的基礎知識。

sed命令是一個非交互式的文本編輯器,它可以對來自文本文件以及標準輸出的行進行編輯。其中,標準輸出可以是來自鍵盤、文件重定向、字符串、變量或者是管道的文本。

sed命令會從文件或者標準輸入中一次讀取一行數據,將其復制到緩沖區,然后讀取命令行或者腳本的編輯子命令,對緩沖區中的文本行進行編輯。重復此過程,一直到所有的文本行都處理完畢。

工作原理

  • 模式空間pattern space:sed在內存里開辟模式空間,處理文件的每個輸入行,最多8192字節

  • 保留空間holding space:sed在內存里開辟保留空間,保存已經處理過的輸入行,最多8192字節

原理:sed 的工作流程主要包括讀取、執行和顯示三個過程

  • 1.讀取:sed 從輸入流(文件、管道、標準輸入)中讀取一行內容并存儲到臨時的緩沖區中(又稱模式空間,pattern space)

  • 2. 執行:默認情況下,所有的sed 命令都在模式空間中順序地執行,除非指定了行的地址,否則sed 命令 將會在所有的行上依次執行

  • 3.顯示:發送修改后的內容到輸出流。在發送數據后,模式空間將會被清空

  • 重復上述過程,直到將文件中所有數據處理完畢

基本語法

sed -參數	'[定址符]'  '[操作]'  文件名參數:
-n,--quiet,--silent:安靜模式,不輸出模式空間中的內容,在一般sed的用法中,所有來自STDIN的數據一般都會被列出到屏幕上,但如果加上-n參數后,則只有經過sed特殊處理的那一行才會被列出來
-i:  直接編輯原文件,而不是由屏幕輸出,默認不對原文件進行操作
-e:  直接在命令行模式上進行sed的動作編輯,多個子命令之間也可以用分號隔開,如:sed -e command1; command2......filename  或者  sed -e 'command1'  -e 'command2'......filename
-r:使用擴展正則表達式F
-f:  直接將sed的動作寫在一個文件內,-f filename則可以執行filename內的sed動作--help:顯示幫助--version:顯示版本-{}:  可組合多個命令,以分好隔開
定址符
  • 用于使用數字指定處理行區間,或者使用正則進行過濾

  • 表示方法

地址定界

作用
1,5對文件的1-5行進行處理
2,$對文件的2-最后一行進行處理
1,+3對文件第一行以及以后的第三行內容進行處理
1~2對文件的1,3,5,7,......的行進行處理
/正則表達式/對任何能夠被正則表達式匹配帶的行進行處理
操作
S: 替換,普換指定字符,一般搭配正則表達式
d: 刪除,刪除選定的行。
p: 打印,如果同時指定行,表示打印指定行:如果不指定行,則表示打印所有內容:如果有非打印字符,則以 ASCII 碼輸出。其通常與“-n” 選項一起使用。
=: 打印行號。
a: 增加,a的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)
i: 插入,i的后面可以接字串,而這些字串會在新的一行出現(目前的上一行)
C: 行替換,指定行中的所有內容,普換成該選項后面的字符串。
y: 字符轉換,轉換前后的字符長度必須相同。
l(小寫):打印數據流中的文本和不可打印的ASCII字符(比如結束符$、制表符\t)
!: 對指定行以外的所有行應用命令
&: 代表匹配到的內容
詳細示例
### 切記多加練習!!!
[root@server ~]# vim sed1.txt[root@server ~]# sed -n 'p' sed1.txt  #打印全文[root@server ~]# sed -n '=;p' sed1.txt # 打印全文并顯示行號[root@server ~]# sed -n -e '=' -e  'p' sed1.txt [root@server ~]# sed -n 'l' sed1.txt  #打印控制字符[root@server ~]# sed -n '1p' sed1.txt  # 打印第一行[root@server ~]# sed -n '1p' sed1.txt # 不加-n會顯示全部,加-n只顯示處理行
[root@server ~]# 
[root@server ~]# sed -n '4,6p' sed1.txt  #打印4-6行
four
five
six[root@server ~]# sed -n '7,$p' sed1.txt # 打印7到最后一行
seven
eight
nine
ten[root@server ~]# sed -n '$p' sed1.txt #打印最后一行
ten[root@server ~]# sed -n '1~2p' sed1.txt #打印基數行
one
three
five
seven
nine[root@server ~]# sed -n '2~2p' sed1.txt  #打印偶數行
two
four
six
eight
ten
[root@server ~]# sed -n '4p;6p;8p' sed1.txt #打印4,6 8行
four
six
eight[root@server ~]# sed -n -e '4p' -e '6p' -e '8p' sed1.txt 
four
six
eight[root@server ~]# sed -n '1!p' sed1.txt #打印非第一行內容
two
three
four
five
six
seven
eight
nine
ten[root@server ~]# sed -n '1,+5p' sed1.txt  #打印第一行后的5行
one
two
three
four
five
six[root@server ~]# sed -n '/^f/p' sed1.txt  #打印f開頭的行
four
five[root@server ~]# sed -n '/t/p' sed1.txt  #檢索包含t的行
two
three
eight
ten[root@server ~]# sed -n '/^f/p;/t/p' sed1.txt  #檢索f開頭行或者包含t的行
two
three
four
five
eight
ten[root@server ~]# sed -n '2,/five/p' sed1.txt #檢索第二行到five所在行
two
three
four
five[root@server ~]# sed -n '/n$/p' sed1.txt #檢索n結尾的行
seven
ten[root@server ~]# sed -n 'n;p' sed1.txt #打印偶數行
two
four
six
eight
ten[root@server ~]# sed -n 'p;n' sed1.txt #打印奇數行
one
three
five
seven
nine[root@server ~]# sed -n '$=' sed1.txt #打印行數
10

文本替換

范例文件

[root@server ~]# cp /etc/passwd ~/ps
[root@server ~]# ls
公共  視頻  文檔  音樂  anaconda-ks.cfg  ps
模板  圖片  下載  桌面  passwd           sed1.txt
格式
sed '行范圍s/舊字符串/新字符串/替換標記'  處理文件名
  • 行范圍:使用數字表示,即對第幾行到第幾行進行替換管理處理,若省略則表示進行全文處理

  • s:替換動作

  • 替換標記

1.數字: 使用1-512之間的數字,表示指定需要替換的字符串出現第幾次才進行替換

2.g: 對數據中所有匹配到的內容進行替換,若省略g則只會對第一次匹配的內容進行替換

3.p:替換成功立刻打印,一般與-n一起使用D:

4.w :文件名:將緩沖區的內容寫入到指定文件中

5.?&: 使用正則表達式匹配的內容進行替換

6.\: 轉義符,若有特殊符號或路徑則需要轉義

示例
# 替換root為boot
[root@server ~]# sed  's/root/boot/g' ps#將每一行的第一個root替換為admin
[root@server ~]# sed -n  's/root/admin/p' ps
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin#將本行第二次出現的root進行替換admin
[root@server ~]# sed -n 's/root/admin/2p' ps
root:x:0:0:admin:/root:/bin/bash#將全文所有root進行替換admin并打印
[root@server ~]# sed -n 's/root/admin/gp' ps
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin#將第四行的adm替換為root
[root@server ~]# sed -n '4s/adm/root/p' ps #替換第一個
root:x:3:4:adm:/var/adm:/sbin/nologin
[root@server ~]# sed -n '4s/adm/root/gp' ps #加g,全行替換
root:x:3:4:root:/var/root:/sbin/nologin#將行尾的/sbin/nologin替換為/bin/bash  注意:/需要轉義
[root@server ~]# sed -n 's/\/sbin\/nologin/\/bin\/bash/p' ps#注意:上例中替換內容包含路徑符號/,可以使用#暫時替代sed命令中的/,可改為
[root@server ~]# sed 's#/sbin/nologin#bin/bash#p'  ps#將最后一行的:替換為@
[root@server ~]# sed -n '$s/:/@/gp' ps
fox_6@x@1000@1000@fox_6@/home/fox_6@/bin/bash#全文注釋
[root@server ~]# sed  's/^/#&/p' ps #指定位置處左側添加#
[root@server ~]# sed  's/^/#/p' ps#檢索ssh行在其單詞左側添加一個#
[root@server ~]# sed -n  's/SSH/#&/gp' ps
sshd:x:74:74:Privilege-separated #SSH:/usr/share/empty.sshd:/sbin/nologin
#右側添加#
[root@server ~]# sed -n  's/SSH/&#/gp' ps
sshd:x:74:74:Privilege-separated SSH#:/usr/share/empty.sshd:/sbin/nologin#所有的行首添加@及行尾添加@
[root@server ~]# sed -e  's/^/@&/' -e ' s/$/&@/' ps#在第一行之前插入空白行
[root@server ~]# sed  '1s/^/\n/' ps#最后一行之后插入空白行
[root@server ~]# sed  '$s/$/\n/' ps#所有小寫改為大寫,\u表示大寫  &:啟用正則
[root@server ~]# sed 's/[a-z]/\u&/g' ps#所有大寫改小寫,\l(小寫l):表示小寫字母
[root@server ~]# sed -i  's/[A-Z]/\l&/g'  ps#單詞第一個字母大寫 \b:表示分匹配單詞的邊界
[root@server ~]# sed 's/\b[a-z]/\u&/g' ps
#實戰1:關閉或者打開selinux
[root@server ~]# sed -i '22s/disabled/enforcing/' /etc/selinux/config #實戰2:apache的網頁目錄修改
[root@server ~]# yum install httpd -y
[root@server ~]# sed -i -e  '124s/\/var\/www.html/\/zy/' -e '129s/\/var\/www/\/zy/' /etc/httpd/conf/httpd.conf 
[root@server ~]# vim /etc/httpd/conf/httpd.conf 
#利用替換實現刪除#將全文的root刪除
[root@server ~]# sed -n 's/root//gp' ps#刪除每一行的第一個字符
[root@server ~]# sed -n  's/^.//p' ps 		#.代表任意#刪除每一行的最后字符
[root@server ~]# sed -n 's/.$//p' ps#刪除注釋符#
[root@server ~]# sed -n 's/^#//p' /etc/sos/sos.conf #刪除5-10行的所有數字
[root@server ~]# sed '5,10s/[0-9]//g' ps#刪除特殊字符(出來數字字母),即將結果寫入到t1.txt中
[root@server ~]# sed 's/[^(0-9)(a-z)(A-Z)]//gw t1.txt' ps

文本刪除

注意:d操作用于刪除文本的特定航,會刪除指定的所有內容,則使用該命令必須特別小心,若忘記指定處理行的話會刪除所有內容,也不會任何輸出

示例?
示例文件
[root@server ~]# cp /etc/sos/sos.conf ~/#刪除第一行
[root@server ~]# sed '1d' sos.conf #刪除2-5行
[root@server ~]# sed '2,5d' sos.conf #刪除8-最后一行
[root@server ~]# sed '8,$d' sos.conf #刪除最后一行
[root@server ~]# sed '$d' sos.conf #使用變量最為行號
[root@server ~]# num_line=1
[root@server ~]# sed "${num_line}d" sos.conf #注意雙引號#刪除空白行
[root@server ~]# sed '/^$/d' sos.conf #刪除帶[]
[root@server ~]# sed '/\[/d' sos.conf [root@server ~]# sed '/root/d' ps

插入文本

注意:使用a動作在文本最后追加一行,使用i動作在指定行前添加一行,倆者格式相同

?格式
sed '行范圍a(或i)\新文本' 文件名
示例
[root@server ~]# sed -i '$a\192.168.228.133 www.openlab.com' /etc/hosts[root@server ~]# sed -i '3i\192.168.228.132 www.openlab.com' /etc/hosts[root@server ~]# sed -i '/132/i\192.168.228.131 www.openlab.com' /etc/hosts#注意:sed是基于數據流處理的命令,若文本無內容則無法處理,座椅空文件無法插入內容
[root@server ~]# touch t2.txt
[root@server ~]# sed -i '$a\xaio ming 19,98.5' t2.txt 
[root@server ~]# cat t2.txt 

3.awk

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15493.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Sam Altman微軟Build 2024最新演講:AI可能是下一個移動互聯網

大家好,我是木易,一個持續關注AI領域的互聯網技術產品經理,國內Top2本科,美國Top10 CS研究生,MBA。我堅信AI是普通人變強的“外掛”,所以創建了“AI信息Gap”這個公眾號,專注于分享AI全維度知識…

【C++11】lambda匿名函數和包裝器

目錄 一,lambda匿名函數 1-1,lambda的引入 1-2,lambda表達式書寫格式 1-3,lambda函數的名稱 1-4,lambda捕獲列表的使用 1-5,函數對象與lambda表達式 二,包裝器 2-1,function…

信息系統管理工程師知識點

信息系統管理工程師知識點 損壞包括自然災害、物理損壞(磁盤壞、設備使用壽命,外力破損)、設備故障(停電、電磁干擾)。 泄漏包括電磁輻射(偵聽微機損傷過程)、乘機而入(合法用戶進…

一天了解一個機器學習模型——機器學習基礎知識

人工智能的兩大任務——預測和決策 預測包括對輸入目標的模式識別、標簽分類、回歸、預測未來數據、聚類 決策需要機器產生行動,改變狀態,如下圍棋、自動駕駛 支持人工智能的四大類技術 搜索——結合算法探索分支的好壞,從而做出決策&…

如何使用maven運行SpringBoot程序?

目錄 一、什么是maven 二、什么是SpringBoot 三、如何使用maven運行SpringBoot程序? 一、什么是maven Maven:簡化Java項目構建的自動化工具 在軟件開發的世界里,Maven以其強大的項目管理和構建自動化功能,為Java開發者提供了…

內存泄漏及其解決方法

1. 系統崩潰前的現象 垃圾回收時間延長:從原本的約10ms增長至50ms,Full GC時間也由0.5s增加至4-5s。Full GC頻率增加:最短間隔可縮短至1分鐘內發生一次。年老代內存持續增長:即使經過Full GC,年老代內存未見明顯釋放。…

容器化:ES和Kibana

1 緣起 最近在學習使用ES, 為了找一個功能強大的可視化工具,之前使用了ES-Head,可以滿足學習需求。 閑暇時間又折騰了另一個工具Kibana, 分享如下。 Kibana優點: 用戶友好性:Kibana提供直觀易用的用戶界面…

Strategy設計模式

Strategy設計模式舉例。 看圖&#xff1a; 代碼實現&#xff1a; #include <iostream>using namespace std;class FlyBehavior { public:virtual void fly() 0; };class QuackBehavior { public:virtual void quack() 0; };class FlyWithWings :public FlyBehavior …

數據庫(vb.net+OleDB+Access)簡易學生信息管理系統

在我們日常生活當中&#xff0c;數據庫一詞往往離不開我們的編程界&#xff0c;在學校、倉庫等方面起著存儲數據及數據關系作用的文件。相較于Excel&#xff0c;Access可以存儲無限多的記錄&#xff0c;內容也十分豐富&#xff0c;例如文本、數字、日期、T&F等。而且不需要…

k8s命令式對象管理和配置

kubectl補全: # dnf install -y bash-completion # echo "source <(kubectl completion bash)" >> ~/.bashrc # kubectl completion bash > /etc/bash_completion.d/kubectl 命令式對象管理 kubectl命令 # 查看所有pod kubectl get pod # 查看某個po…

gbk轉utf-8

你們曾經有沒有因為文件的編碼問題而苦惱過&#xff1f;在Windows下開發時&#xff0c;尤其是項目初期&#xff0c;如果沒有特別注意文件的字符編碼問題&#xff0c;等到項目變大后&#xff0c;用Git對比代碼時&#xff0c;很可能會發現一些亂碼。這時才意識到字符編碼的重要性…

LLM——探索大語言模型在心理學方面的應用研究

1. 概述 心理學經歷了多次理論變革&#xff0c;目前人工智能&#xff08;AI&#xff09;和機器學習&#xff0c;特別是大型語言模型&#xff08;LLMs&#xff09;的使用&#xff0c;預示著新研究方向的開啟。本文詳細探討了像ChatGPT這樣的LLMs如何轉變心理學研究。它討論了LL…

docker- 鏡像 導出導入

文章目錄 前言docker- 鏡像 導出導入1. 導出2. 刪除鏡像3. 導入鏡像 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實在白嫖的話&…

Nginx 從入門到精通-Nginx-Web服務器的瑞士軍刀

在當今互聯網高速發展的時代&#xff0c;作為Web服務器的Nginx可謂是一把"瑞士軍刀"&#xff0c;其強大的功能和出色的性能備受青睞。然而&#xff0c;僅僅停留在"會用"的層面是遠遠不夠的&#xff0c;要充分發揮Nginx的潛力&#xff0c;我們還需要深入了解…

SpringBoot Validation自定義注解之校驗指定最小整數

1&#xff0c;引入核心關鍵依賴 <!--數據校驗--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> 2&#xff0c;自定義注解 package com.taia.ym…

忘記“也是一門學問:機器如何忘記自己學到的知識?

在信息時代&#xff0c;我們常常希望人工智能能夠學到更多的知識&#xff0c;變得更加智能。但你是否想過&#xff0c;有時候讓機器"忘記"一些它學到的東西&#xff0c;也是一件很重要的事&#xff1f; 隨著用戶隱私保護意識的提高和相關法律法規的出臺&#xff0c;…

深入理解內聯函數(C語言)

目錄 1.什么是內聯函數2.內聯函數與宏3.編譯器對內聯函數的處理4.參考文獻 1.什么是內聯函數 很多人都會知道&#xff0c;可以將比較小的函數寫成內聯函數的形式&#xff0c;這樣會節省函數調用的開銷&#xff0c;具體是什么樣的開銷呢&#xff1f; 一個函數在執行過程中&…

v-if 與 v-show(vue3條件渲染)

v-if 是“真正”的條件渲染&#xff0c;因為它會確保在切換過程中條件塊內的事件監聽器和子組件適當地被銷毀和重建。 v-if 也是惰性的&#xff1a;如果在初始渲染時條件為假&#xff0c;則什么也不做——直到條件第一次變為真時&#xff0c;才會開始渲染條件塊。 相比之下&a…

Java—單例模式

什么是單例模式&#xff1f; 單例模式是一種軟件設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來訪問該實例。在單例模式中&#xff0c;類自身負責創建自己的唯一實例&#xff0c;并且保證在整個應用程序中只能訪問到這個實例。 實現步驟&a…

IDEA通過tomcat運行注意事項

配置run--》edit configurations 以下的A B部分要保持一致 A和B的路徑要保持一致