linux文本處理常用指令總結

引子

作為一個偏愛windows的程序員,以前做文本處理的時候總是喜歡在windows下用notepad++等圖形化工具處理,比如有時需要把linux服務器上一個文件進行一次全局字符串替換這樣簡單的操作,還得把文件down到本地編輯好再傳回去。這兩天買了本《鳥哥的Linux私房菜》,終于靜下心系統的學習了一下linux下的文本處理,感覺其實沒有想象的難,如果早點學會節約下來的大量時間肯定遠超過學習所花的時間。

概覽

先說一下本文要介紹的內容:

  1. 簡單回顧一下正則表達式,如果熟悉正則,至少知道正則分為基本正則和擴展正則可以跳過該部分。
  2. 本文主體:介紹4個linux文本處理命令:grep、sed、printf、awk。

下面正式開始。

正則表達式回顧

這部分是給會正則表達式的讀者簡單回顧一下正則表達式,如果沒學過正則表達式的讀者建議先找相關資料學習正則表達式再來看本文。

正則表達式分為基本正則表達式和擴展正則表達式,內容如下:

基本正則表達式

正則表達式字符含義
^word查找以word開頭的文本
word$查找以word結尾的文本
.代表一個任意字符
\轉義符
*0到多個字符
[abc]代表一個字符,這個字符是a或b或c
[a-z];[0-9]代表a到z中的一個字符;0到9中的一個數字
[^abc]代表一個非a、b、c的字符
{m,n}m到n個字符

?

擴展正則表達式

正則表達式字符含義
+一個或多個字符
零個或一個字符
|或者
()分組

?

文本處理命令

grep

grep的作用是按行查找字符,輸出包含字符的行。

grep用法:

grep一般有兩種用法,一種是從文件查找,一種是從管道的輸入查找,

  1. grep 'word' file.txt
  2. cat file.txt|grep 'word'

grep的常用參數:

參數含義及示例
-n輸出結果加行號
--color=auto匹配的關鍵字高亮顯示
-A3輸出匹配行的后三行
-B2   輸出匹配行的前兩行
-v  反向查找,即輸出不包含關鍵字的行
-i關鍵字匹配時忽略關鍵字大小寫

grep使用小技巧:

多數情況我們都想要高亮關鍵詞(使用--color=auto參數),因此可以在~/.bashrc文件中添加上:

alias grep='grep --color=auto'

?

,再用

source ~/.bashrc

讓配置生效。這樣當我們使用grep的時候,就自動帶了--color=auto參數。

grep使用示例:

grep的查找主要就是基于基本正則表達式的匹配,下面只是簡單的給一些常用例子供參考。

grep 't[ae]st'  //查找tast或test

grep '[0-9]'   //查找數字

grep '[^a-z]oo'  //查找Xoo,其中X是一個非a到z的字符

grep '^the'  //查找以the開頭的字符,這里注意區分^出現在[]里時代表“非某字符”,如上個例子,出現在[]外時代表"以某字符開頭",如這個例子。

grep '^$'  //查找空行

grep 'o\{2\}'  //查找兩個o,這里需要注意,{}在shell里有特殊意義,因此需要轉義,這里與一般的正則使用不同,需要注意。

egrep:

我們知道正則表達式分為基本正則表達式和擴展正則表達式,但是grep只支持基本正則表達式,如果要是用擴展正則表達式,需要使用egrep命令。

幾個例子:

egrep 'gd|good'  //查找gd或good

egrep 'g(la|oo)d'  //查找glad或good

egrep 'A(xyz)+C'  //查找AXC,其中X是一個或一個以上的'xyz'字符串。

?

sed

sed是一個很強大的命令,可以用來做行刪除行新增行選取行替換字符串的替換這5種操作。

sed是一個管道命令,可以處理管道輸入。

1.行刪除

nl /etc/passwd | sed '2d'  //刪除第2行

下面將省略輸入管道

sed '2,5d'  //刪除第2~5行

sed '3,$d'  //刪除第3到最后一行,$代表最后一行

sed '/^$/d'  //刪除空行

2.行新增

sed '2a drink tea'  //在第二行下面追加一行"drink tea",a代表append

sed '2i drink tea'  //在第二行上面插入一行"drink tea",i代表insert

sed '2a a\

b\

c'  //在第二行下面追加三行 "a"、"b"、"c",只需要每行結尾加"\"即可。

3.行選取

sed -n '5,7p'  //選取第5到7行輸出,必須加-n參數,不然效果就是所有行都被輸出,而5到7行輸出兩次。

4.行替換

sed '2,5c No 2~5 lines'  //將第2到5行替換為一行字符串"No 2~5 lines"

5.字符串替換

sed 's/要被替換的字符串/新的字符串/g'  //固定的格式,開頭是s結尾是g,中間三個/分隔開要被替換的字符串和新的字符串,注意這里要被替換的字符串可以是正則表達式。

?

將操作結果直接寫入文件

默認用sed對文件做修改之后,只是輸出修改后的文件,可以用>寫入到新的文件。但是如果想修改原始文件,千萬不能>到原始文件,這樣執行的結果就是原文件直接被清空了。想要修改原始文件可以用 -i 參數,如:

sed -i '2d' file.txt  //直接將原文件中的第二行刪除。

直接修改原文件是很危險的,一旦修改錯誤無法還原。可以先不加 -i 參數執行命令把修改結果打印出來,確認無誤后再加上 -i 參數。

printf

printf這個命令用語言不太好描述,但是一動手就明白了。

把下面的內容保存為printf.txt:

Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33

先cat看一下,是下面這個效果:

現在用printf指令加一些參數來看一下,執行

printf '%10s %10s %10s %10s %10s \n' `cat printf.txt`

輸出結果:

是不是比cat輸出的結果漂亮多了。

%10s代表這一列的寬度固定為10個字符。更多的格式就不介紹了,這篇文章我們掌握一個%10s就夠了。

printf不是管道命令,要想用它處理文件必須像上面的命令那樣使用`cat printf.txt`把文件內容給提出來。

printf的使用相當廣泛,后面的awk命令中也會應用到printf命令。

awk

awk命令主要是將文件通過分隔符拆成列來處理,還能通過條件判斷對不同的行進行不同的處理,甚至還可以進行數值計算~

我們也是通過例子來學習。

我們先用last命令看一下最后登錄的5個用戶信息:

圖中的第一列是用戶名,第三列是用戶ip,現在我們想摘出這兩列,用awk就可以做到:

last -5|awk '{print $1 "\t" $3}'

輸出:

命令看起來挺復雜,不要著急,其實很簡單。

首先awk使用時有固定的格式:awk '{命令}',單引號和大括號就是固定的格式而已。

然后上面的命令就是

print $1 "\t" $3    //awk默認會用空格和tab將每行分隔為N列,$1代表第一列,$3代表第三列。

這樣一看是不是簡單多了。

剛剛的last命令產生的數據默認就是用tab分隔的,現在我們看另一個例子,執行 cat /etc/passwd:

這次產生的數據每行是用 ?: 分隔的,那么想使用awk輸出第一列和第三列就需要執行分隔符:

cat /etc/passwd|awk -F ':' '{print $1 "\t" $3}'    // -F ':' 代表指定使用 : 作為分隔符

執行結果:

除了$1,$3這樣的特殊符號,

awk的命令中還可以使用下面的特殊符號:

NF :每一行分隔后的列數

NR :行號

下面用一個綜合的例子來說明awk的條件判斷和數值計算,有這樣一組數據保存為pay.txt:

Name    1st   2nd   3rd
VBird   23000   24000  25000
DMTsai  21000   20000  23000
Bird2   43000   42000  41000

現在想加一列"Total",計算每一行的數值總和。

用awk可以完成這個需求:

cat pay.txt |awk 'NR==1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,"Total"};NR>1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,$2+$3+$4}'

運行結果:

?

這里有幾個要點:

  1. 加入條件判斷后,awk的格式為: awk '條件1 {命令1};條件2{命令2}'
  2. 條件判斷有以下邏輯運算:
    • >
    • <
    • >=
    • <=
    • ==  //注意判斷相等要用兩個等號
    • !=
  3. 可以直接運算行內列的值($1、$2、$3)。

總結

這篇文章首先回顧了正則表達式(基本正則表達式、擴展正則表達式),然后介紹了4個常用命令,最后我們歸納一下四個命令的用途:

命令用途
grep/egrep關鍵字查找
sed
  1. 行的刪除、添加、替換、選取
  2. 關鍵字替換
printf?文件格式化輸出
awk
  1. ?將每行按分隔符拆分成列并選取某些列
  2. ?通過邏輯判斷對不同行進行不同的處理
  3. ?對一行中的幾列數值進行計算

?

參考資料:

《鳥哥的Linux私房菜 ?基礎學習篇(第三版)》 ?第12章

轉載于:https://www.cnblogs.com/sheeva/p/6406285.html

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

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

相關文章

CSS——基礎選擇器

CSS的基礎選擇器1 CSS指的是層疊樣式表2 CSS規則由兩個主要的部分構成選擇器&#xff0c;以及一條或多條聲明3 選擇器通常是你需要改變樣式的 HTML 元素如h14 每條聲明由一個屬性和一個值組成&#xff0c;每個屬性有一個值&#xff0c;屬性和值被冒號分開5 屬性大于 …

Linux中chown和chmod的區別和用法

chmod修改第一列內容&#xff0c; chown修改第3、4列內容&#xff1a; chown用法&#xff1a; 用來更改某個目錄或文件的用戶名和用戶組。 chown 用戶名:組名 文件路徑&#xff08;可以是絕對路徑也可以是相對路徑&#xff09; 例1&#xff1a;chown root:root /tmp/tmp1 就…

玩大數據期間碰到的一些問題總結

文章目錄問題一&#xff1a;Zookeeper節點數量為什么建議是奇數個&#xff1f;問題二&#xff1a;HA機制的Hadoop集群中Journal Node 作用問題三&#xff1a;兩個datanode節點互相排斥怎么解決&#xff08;集群無法識別新加入的Datanode&#xff09;&#xff1f;問題四&#xf…

JAVA的SSH框架登錄注冊

Struts 的MVC設計模式可以使我們的邏輯變得很清晰&#xff0c;主要負責表示層的顯示。 Spring 的IOC和AOP可以使我們的項目在最大限度上解藕。 hibernate的就是實體對象的持久化了, 數據庫的封裝。 項目截圖&#xff1a;(代碼是按照項目截圖上傳的&#xff0c;直接對號入座即可…

Visual Studio Code 前端調試不完全指南

本文最初發布于我的個人博客&#xff1a;咀嚼之味Visual Studio Code (以下簡稱 vscode) 如今已經代替 Sublime&#xff0c;成為前端工程師們最喜愛的代碼編輯器。它作為一個大型的開源項目&#xff0c;不斷推陳出新&#xff1b;社區中涌現出大量優質的插件&#xff0c;以支持我…

MySQL中(delete、truncate、drop) 的區別

delete、truncate、drop的用法 MySQL 數據表中delete刪除數據的通用語法&#xff1a; ###刪除 students_tbl 表中 student_id 為3 的記錄&#xff1a; delete from students_tbl where student_id3; MySQL 數據表中truncate刪除數據的通用語法&#xff1a; ###刪除 students_…

機器學習之LDA主題模型算法

文章目錄1、知道LDA的特點和應用方向1.1、特點1.2、應用方向2、知道Beta分布和Dirichlet分布數學含義3、了解共軛先驗分布4、知道先驗概率和后驗概率5、知道參數α值的大小對應的含義6、掌握LDA主題模型的生成過程7、知道超參數α等值的參考值8、LDA總結1、知道LDA的特點和應用…

分別寫出引入CSS的3種方式, 特點, 優先級

第一&#xff1a;css的三種引入方式 1.行內樣式 最直接最簡單的一種&#xff0c;直接對HTML標簽使用style""&#xff0c;例如&#xff1a; <p style"color:#F00; "></p> 缺點&#xff1a;HTML頁面不純凈&#xff0c;文件體積大&#xff0c…

[Go] Template 使用簡介

Golang 提供了兩個標準庫用來處理模板 text/template 和 html/template。我們使用 html/template 格式化 html 字符。 模板引擎 模板引擎很多&#xff0c;Python 的 jinja&#xff0c;nodejs 的 jade 等都很好。所謂模板引擎&#xff0c;則將模板和數據進行渲染的輸出格式化后的…

內存泄露監測

2019獨角獸企業重金招聘Python工程師標準>>> iOS 內存泄露監測 144 作者 謝謝生活 已關注 2017.05.19 17:38* 字數 4235 閱讀 209評論 0喜歡 6 iOS可能存在的內存泄露&#xff1a;block 循環引用。當一個對象有一個block屬性&#xff0c;而block屬性又引用這個對象…

玩Azkaban跳過的坑

文章目錄一號坑&#xff1a;啟動Azkaban報錯&#xff1a;User xml file conf/azkaban-users.xml doesnt exist.二號坑&#xff1a;報錯&#xff1a;failed SslSocketConnector0.0.0.0:8443: java.io.FileNotFoundException: /home/hadoop/app/azkaban/azkaban-web-2.5.0/bin/ke…

兩種解除禁止右鍵、選中、復制的方法

我在網上找的 兩種解除禁止右鍵、選中、復制的方法 1、直接存到書簽點擊即可 javascript:(function(){var docdocument;var bddoc.body;bd.onselectstartbd.oncopybd.onpastebd.onkeydownbd.oncontextmenubd.onmousemovebd.onselectstartbd.ondragstartdoc.onselectstartdoc.o…

刪除節點removeChild()

http://www.imooc.com/code/1700 刪除節點removeChild() removeChild() 方法從子節點列表中刪除某個節點。如刪除成功&#xff0c;此方法可返回被刪除的節點&#xff0c;如失敗&#xff0c;則返回 NULL。 語法: nodeObject.removeChild(node) 參數: node &#xff1a;必需&…

機器學習自主解決安全威脅離我們還有多遠?

曾經聽見不止一次這樣的問題&#xff1a; “機器學習會替代基于人工經驗規則的安全解決方案么&#xff1f;”把這個問題放在去年來看&#xff0c;我們已經得到了非常多的討論甚至是一些已經實際應用的解決方案&#xff0c;對于人工智能在安全以及其它各種對數據進行價值挖掘的場…

Linux執行定時任務(crontab)遇到的坑

文章目錄前言&#xff1a;1、建立定時任務的兩種方式1.1、crontab -e1.2、vi /etc/ crontab2、兩種方法的區別2.1、用戶級2.2、系統級3、解決辦法前言&#xff1a; 之前第一次要在生產環境部署定時任務&#xff0c;無奈的是&#xff0c;博主對定時任務這塊還是個小白&#xff…

Vue:解決[Vue warn]: Failed to resolve directive: modle (found in Anonymous)

解決問題 [Vue warn]: Failed to resolve directive: modle (found in <ComponentA>) console.error(("[Vue warn]: " msg trace)); 原因是 我把model 寫成了 modle 這類錯誤一般是單詞寫錯了 (found in <Anonymous>) 解決思路

Oracle樹查詢及相關函數

Oracle樹查詢的最重要的就是select...start with... connect by ...prior 語法了。依托于該語法&#xff0c;我們可以將一個表形結構的中以樹的順序列出來。在下面列述了Oracle中樹型查詢的常用查詢方式以及經常使用的與樹查詢相關的Oracle特性函數等&#xff0c;在這里只涉及到…

Mysql常用函數總結

文章目錄前言&#xff1a;1、日期相關函數1.1、mysql獲取未來、現在、過去的時間&#xff1a;DATE_SUB&#xff08;&#xff09;、DATE_ADD()1.2、格式化日期&#xff1a;date_format&#xff08;&#xff09;1.3、MySQL 日期、時間相減函數&#xff1a;datediff(date1,date2),…

一行Python代碼制作動態二維碼

目錄 1、普通二維碼 2、藝術二維碼 3、動態二維碼 在GitHub上發現了一個比較有意思的項目&#xff0c;只需要一行Python代碼就可以快捷方便生成普通二維碼、藝術二維碼(黑白/彩色)和動態GIF二維碼。 GitHub網站參加&#xff1a;https://github.com/sylnsfar/qrcode 用法比…

Vue常用經典開源項目匯總參考-海量

Vue常用經典開源項目匯總參考-海量 Vue是什么&#xff1f; Vue.js&#xff08;讀音 /vju?/, 類似于 view&#xff09; 是一套構建用戶界面的 漸進式框架。與其他重量級框架不同的是&#xff0c;Vue 采用自底向上增量開發的設計。Vue 的核心庫只關注視圖層&#xff0c;并且非常…