Linux中的awk、sed、grep及正則表達式詳解

Linux中的awk、sed、grep及正則表達式詳解

簡介

awk、sed和grep是Linux中文本操作的三大利器。

其中awk適用于取列,sed適用于取行,grep適用于過濾

正則表達式

首先我們來介紹一下正則表達式,正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

正則表達式是文本操作的好幫手。

以下是正則表達式的元字符及含義說明。

元字符功能
^匹配行首
$匹配行尾
^$空行
.匹配任意單個字符,包括0次
*匹配多個字符,包括0次
[ ]匹配指定范圍內的任意單個字符
[^]匹配不在指定范圍內的任意字符
.*匹配任意長度任意字符,不包括0次
..匹配子串
&保存搜索字符用來替換其他字符
\<匹配單詞的開始,其后任意字符必須作為單詞的首部出現
\>匹配單詞的結束,其前任意字符必須作為單詞的尾部出現
x\{m\}匹配字符x出現的次數,m次
x\{m,\}匹配字符x出現的次數,至少m次
x\{m,n\}匹配字符x出現的次數,至少m次,不多于n次
?匹配前面的字符1次或0次

有了正則表達式的幫助,我們就可以正式開始來看文本操作三兄弟了。

awk

awk 是對文本進行格式化的工具,適合處理比較復雜的格式處理。有多個版本: 1、new awk: nawk ;2、gawk, awk

awk 命令格式

awk [options] 'script' file1 file2, ...awk [options] 'PATTERN {acticon}' file1 file2, ...

格式說明

  1. pattern部分決定動作語句何時觸發及觸發事件:BEGIN、END

  2. action 對數據進行處理,放在{}內指明:print、printf

  3. 最常用的是 print,默認以空白字符分隔

    $0 代表整行,$1 代表第 1 段,$2 代表第 2 段,以此類推,$NF 代表最后一個字段,多個字段直接用逗號隔開

    awk '{print $1, $2}' xxx.log

    打印操作支持拼接打印,如:awk '{print "first" $1, $2}' xxx.log

  4. options 參數:

參數含義
-F輸入分隔符,默認以空白字符進行分隔
-v輸出分隔符,默認為空格,使用內置變量OFS來設置輸出分隔符

awk內置變量

變量名含義
FS輸入字段分隔符,默認空白字符,一般需要加-F
OFS輸出字段分隔符,默認是空格,一般需要加-v
NF分隔后的字段數量
NR當前行的行號

實例

有時候我們想要拿到當前目錄下的所有文件名,但是如果直接 ls -a | grep "^-"grep "^-" 是過濾只顯示文件,下面會詳細講),得到的結果是:

ls -l | grep "^-"
# 輸出
-rw-r--r-- 1 root root   487305 May  1 06:45 3d1.txt
-rw-r--r-- 1 root root 10004085 May  1 06:45 3d1_image_urls.txt
-rw-r--r-- 1 root root   167934 May  1 06:45 3d1_singleface.txt
-rw-r--r-- 1 root root  9516780 May  1 06:45 3d1_urls.txt
-rw-r--r-- 1 root root  1289925 May  1 06:45 adzz_3d1_urls.txt

如果我們只想要文件名本身,而不想要其他相關信息數據,該怎么辦呢?我們觀察到 ls -l 的輸出信息是很有規律的,并且就是以空白分隔的,這時我們就可以使用 awk 命令:ls -l | grep "^-" | awk '{print $9}'

從而達到我們想要的效果:

ls -l | grep "^-" | awk '{print $9}'
# 輸出
3d1.txt
3d1_image_urls.txt
3d1_singleface.txt
3d1_urls.txt
adzz_3d1_urls.txt

sed

sed 是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”,接著用 sed 命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。

命令格式

sed [options]... 'script' inputfile

參數

參數含義
-n不輸出模式空間,即不自動打印
-e多點編輯
-f [PATH_TO_SCRIPT_FILE]從指定文件中讀取編輯腳本
-r支持使用擴展正則表達式
-i直接編輯文件
-i.bak備份文件并遠處編輯

script 地址定界

  1. 不給地址:對全文進行處理
  2. 單地址:
    • # 指定的行
    • $ 最后一行
    • /pattern/ 被此處模式所能匹配到的每一行

編輯命令

命令說明
d刪除模式空間匹配的行,并立即啟動下一輪循環
p顯示符合條件的行,追加到默認輸出之后
a [\]text在指定行后面追加文本,支持使用\n實現多行追加
i [\]text在行前面插入文本
c [\]text替換行為單行或多行文本
w path/file保存模式匹配的行之指定文件
r path/file讀取指定的文件的文本至模式空間中匹配的行后
=為模式空間的行打印行號
!模式空間中匹配行去反處理
s///查找替換,支持使用其他分隔符,s@@@,s###

替換標記

  1. g 行內全局替換
  2. p 顯示替換成功的行
  3. w path/file 將替換成功的行保存至文件中

例:高效地查看環境變量

sed -i 's/a/v/g' test 將文件中的 a 全部替換為 v ,sed替換格式是:sed -i ‘s/要替換的內容/替換成的內容/g' 文件名

比如說,我們要查看環境變量:

echo $PATH
# 輸出
# /home/ps/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

我們知道,這樣直接打印的話,輸出是按照冒號來進行分隔的,可讀性不佳,為了改善這一點,我們可以用sed將冒號替換為換行符:

echo $PATH | sed "s/:/\n/g"
# 輸出:
# /home/ps/anaconda3/condabin
# /usr/local/sbin
# /usr/local/bin
# /usr/sbin
# /usr/bin
# /sbin
# /bin
# /usr/games
# /usr/local/games
# /snap/bin

這樣可讀性就會好很多。

grep

grep 強大的文本搜索工具,根據模式搜索文本,并將符合模式的文本行顯示出來。

命令格式:

grep [option] pattern [file]

option 參數

參數含義
-i忽略字符大小寫
-n顯示匹配的行號
-v顯示沒有被匹配的行,即反轉查找
--color將匹配到的字符以高亮顏色顯示出來
-c統計匹配的行數
-o僅顯示匹配到的字符串
-q靜默模式,不輸出任何信息
-w匹配整個單詞
-Aafter,顯示后行
-Bbefore,顯示前行
-Ccontext,顯示前后行
-E相當于egrep,即grep -E == grep

這里我們以很常用的查看目錄中文件/目錄的個數命令為例,分析此例中grep的用法:

這是筆者在網上搜到的查看目錄中的文件數:ls -l | grep "^-" | wc -l的命令,我們來看一下他都干了什么。

首先要明確中間的兩道 |管道,不了解的讀者可以簡單地理解為將前一命令的輸入直接作為后一命令的輸出。

  1. 我們先ls當前目錄手動數一下有多少文件。在這里插入圖片描述

    藍色字體的都是目錄,白色字體則是一些文本文件。可以看到,當前目錄下有3個文件,5個目錄。

    再用查到的命令來試一下ls -l | grep "^-" | wc -l在這里插入圖片描述

    沒有問題,與預期相符。

  2. 第一條命令ls -l,我們來看打印輸出了什么在這里插入圖片描述

    是各個文件/目錄的一些詳細信息。我們注意到每一行的第一個字符d或者-分別代表了本行表示的是一個目錄,還是一個文件。相必整條命令應該也是借助這一點來判斷當前目錄下的子目錄/文件個數的。

  3. 我們再看第二條命令grep "^-", 果然,我們之前提到過,正則表達式的^就是來匹配第一個字符的,而要查的是文件的個數,自然應該找第一個字符為-的行。那找目錄是不是就是應該匹配行首的d呢?我們來試一下:在這里插入圖片描述

    果然,與我們數的子目錄個數也是符合的。這樣我們就知道了怎樣來查看當前目錄下子目錄個數。

    另外,讀者可以自己試一試,既然一個目錄內不是子目錄就是文件,那能不能使用grep的反轉查找參數-v來統計子目錄數呢?

  4. 第三條命令是 wc -l,我們知道wc命令是用來統計字符數的,而加上-l命令則可以統計行數,可以支持我們grep過濾并通過行數來查看文件數的需求。但是,我們注意到,grep命令本來就自帶一個參數-c來統計匹配成功的行數,那是不是可以直接得到文件數呢?我們來試一試ls -l | grep -c "^-"在這里插入圖片描述

    可以看到,也是OK的。是一種更簡便的寫法。

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

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

相關文章

android聚焦時如何給控件加邊框,edittext設置獲得焦點時的邊框顏色

第一步&#xff1a;為了更好的比較&#xff0c;準備兩個一模一樣的EditText(當Activity啟動時&#xff0c;焦點會在第一個EditText上&#xff0c;如果你不希望這樣只需要寫一個高度和寬帶為0的EditText即可避免&#xff0c;這里就不這么做了)&#xff0c;代碼如下&#xff1a;a…

gcc參數 -i, -L, -l, -include

gcc參數 -i, -L, -l, -include -i&#xff0c;-L&#xff0c;-l&#xff0c;-include -l和-L -l參數就是用來指定程序要鏈接的庫&#xff0c;-l參數緊接著就是庫名&#xff0c;那么庫名跟真正的庫文件名有什么關系呢&#xff1f;就拿數學庫來說&#xff0c;他的庫名是m&…

xargs 命令教程

xargs 命令教程 轉自&#xff1a;http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2019年8月 8日 xargs是 Unix 系統的一個很有用的命令&#xff0c;但是常常被忽視&#xff0c;很多人不了解它的用法。 本文介紹如…

android strictmode有什么作用,Android 性能優化 之 StrictMode

8種機械鍵盤軸體對比本人程序員&#xff0c;要買一個寫代碼的鍵盤&#xff0c;請問紅軸和茶軸怎么選&#xff1f;StrictMode概述StrictMode 是用來檢測程序中違例情況的開發者工具。使用StrictMode&#xff0c;系統檢測出主線程違例的情況會做出相應的反應&#xff0c;如日志打…

curl 的用法指南

curl 的用法指南 轉自&#xff1a;http://www.ruanyifeng.com/blog/2019/09/curl-reference.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2019年9月 5日 簡介 curl 是常用的命令行工具&#xff0c;用來請求 Web 服務器。它的名字就是客戶端&#xff08;client&#xf…

怎么在html顯示已登錄狀態,jQuery Ajax 實現在html頁面實時顯示用戶登錄狀態

當網站是全靜態的html頁面時&#xff0c;而又希望網站會員在登錄之后并在所有頁面頭部顯示登錄狀態&#xff0c;如用戶名等&#xff0c;如果未登錄就是未登錄狀態&#xff0c;下面給大家來分享實現的方法。一、在html靜態頁面中加入div&#xff0c;并指定ID如&#xff1a;二、新…

互斥鎖、條件變量、信號量淺析

互斥鎖、條件變量、信號量淺析 互斥鎖與條件變量 條件變量是為了保證同步 條件變量用在多線程多任務同步的&#xff0c;一個線程完成了某一個動作就通過條件變量告訴別的線程&#xff0c;別的線程再進行某些動作&#xff08;大家都在semtake的時候&#xff0c;就阻塞在哪里&a…

xpwifi熱點設置android,教你在XP電腦中開啟設置WiFi熱點使用的步驟

對于系統中網絡的連接問題是最重要的&#xff0c;那在處理不同的錯誤的情況中&#xff0c;對于無線網絡的設置也就是我們說的WiFi的使用也是會遇到問題的&#xff0c;那在操作的時候對于電腦中是怎么實現設置WiFi熱點的的&#xff0c;對于這個問題今天小編就來跟大家分享一下教…

C/C++ 指針詳解

指針詳解 參考視頻&#xff1a;https://www.bilibili.com/video/BV1bo4y1Z7xf/&#xff0c;感謝Bilibilifengmuzi2003的搬運翻譯及后續勘誤&#xff0c;也感謝已故原作者Harsha Suryanarayana的講解&#xff0c;RIP。 學習完之后&#xff0c;回看找特定的知識點&#xff0c;善…

android雙聯動列表,Android Fragment實現列表和內容聯動

在平板上經常能看到這種的情況&#xff1a;左邊是一個列表&#xff0c;右邊是列表項對應的內容&#xff0c;當點擊某一個列表時&#xff0c;右邊內容區也會隨之改變。下面使用fragment簡單的demo&#xff1a;思路&#xff1a;在mainactivity定義一個回調接口&#xff0c;并在列…

linux /proc 詳解

linux /proc 詳解 本文整理了一下 linux /proc下的幾個常用的目錄和文件&#xff0c;可供查閱&#xff0c;之后在學習工作中有別的用到的話會再補充。 /proc 簡介 Linux系統上的/proc目錄是一種文件系統&#xff0c;即proc文件系統。與其它常見的文件系統不同的是&#xff0…

android模擬器太卡,安卓模擬器安裝之后太卡怎么解決

用安卓模擬器玩游戲原理就是在電腦上安裝了一部手機&#xff0c;如果你的電腦配置不是非常高&#xff0c;能不卡頓嗎?遇到卡頓怎么解決?1、安裝最新版本的顯卡驅動。逍遙模擬器對于顯卡的性能要求很高&#xff0c;因此升級至最新版本的顯卡驅動&#xff0c;是確保逍遙模擬器流…

編程環境中Runtime(運行時)的三個含義

編程環境中Runtime&#xff08;運行時&#xff09;的三個含義 轉自&#xff1a;https://www.zhihu.com/question/20607178 知乎答主doodlewind 三個含義 實際上編程語境中的 runtime 至少有三個含義&#xff0c;分別是&#xff1a; 指「程序運行的時候」&#xff0c;即程序…

非常不錯的一款html5【404頁面】,不含js腳本可以左右擺動,原生JavaScript實現日歷功能代碼實例(無引用Jq)...

這篇文章主要介紹了原生JavaScript實現日歷功能代碼實例(無引用Jq),文中通過示例代碼介紹的非常詳細&#xff0c;對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下成品顯示&#xff0c;可左右切換月份html 代碼移動端日歷日一二三四五六css代碼*{margin: 0;pa…

12 [虛擬化] 進程抽象;fork,execve,exit

12 [虛擬化] 進程抽象&#xff1b;fork&#xff0c;execve&#xff0c;exit 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻&#xff1a;https://www.bilibili.com/video/BV1N741177F5?p12 講義&#xff1a;http://jyywiki.cn/OS/2021/slides/8.slides#/ 本講概述 回到“…

計算機應用與基礎實踐怎么考,自考計算機基礎應用科目筆試和實踐性考試怎么考...

自考計算機基礎應用科目筆試和實踐性考試怎么考&#xff1f; 報考自考的考生有些專業的考生會在自己的課程科目中發現計算機基礎應用不僅有理論知識考試還有實踐性考試&#xff0c;那么自考計算機基礎應用科目的筆試和實踐性考試怎么考&#xff1f;自考計算機基礎應用科目筆試怎…

14 [虛擬化] 虛存抽象;Linux進程的地址空間

14 [虛擬化] 虛存抽象&#xff1b;Linux進程的地址空間 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻&#xff1a;https://www.bilibili.com/video/BV1N741177F5?p14 講義&#xff1a;http://jyywiki.cn/OS/2021/slides/10.slides#/ 本講概述 程序 狀態機&#xff1b;…

瀏覽器是指在用戶計算機上,自考《網頁設計與制作》測試題及答案

自考《網頁設計與制作》測試題及答案學習是一個不斷積累的過程&#xff0c;為幫助考生們更好地復習《與制作》科目知識點&#xff0c;以下是搜索整理的一份自考《網頁設計與制作》測試題及答案&#xff0c;供參考練習&#xff0c;希望對大家有所幫助!想了解更多相關信息請持續關…

Ubuntu 18.04 安裝OpenCV C++

Ubuntu 18.04 安裝OpenCV C 構建并安裝 僅構建核心模塊 # 更新并安裝依賴 # 更新并安裝依賴 sudo apt update && sudo apt install -y cmake g wget unzip# 下載并解壓包 wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip unzip opencv.zip…

html計算x的y,HTML5畫布:旋轉時計算x,y點

我開發了一個HTML5 Canvas應用程序&#xff0c;它涉及到讀取一個xml文件&#xff0c;該文件描述了需要在畫布上繪制的箭頭&#xff0c;直形和其他形狀的位置。的XML布局的HTML5畫布&#xff1a;旋轉時計算x&#xff0c;y點實施例&#xff1a;如果對象被旋轉它涉及計算一個點的位…