在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux中文本處理命令的用法

馬哥Linux運維 ? 來源:博客園 ? 2025-04-15 10:22 ? 次閱讀

Linux三劍客及使用介紹

前言

Linux 三劍客是(grep,sed,awk)三者的簡稱,熟練使用這三個工具可以提升運維效率。Linux 三劍客以正則表達式作為基礎,而在Linux系統中,支持兩種正則表達式,分別為“標準正則表達式”和“擴展正則表達式”。在掌握好正則表達式后,將具體講解三劍客的用法。

一、正則表達式

正則表達式:REGular EXPression, REGEXP。我們通過特定的字符串匹配模板,來獲取到所需的內容。熟練掌握好正則表達式是使用Linux三劍客的前提啊。

元字符

.: 匹配任意單個字符;
[]: 匹配指定范圍內的任意單個字符;
[^]:匹配指定范圍外的任意單個字符;

字符集合

[[]]:匹配單個數字;
[[]]:匹配單個小寫字母;
[[]]:匹配單個大寫字母;
[[]]:匹配單個標點字符;
[[]]:匹配單個空白字符;
[[]]:匹配單個字母;
[[]]:匹配單個字母或數字;

匹配次數(貪婪模式)

*:匹配其前面的字符任意次
?:匹配其前面的字符0次或者1次
+:匹配其前面的字符至少1次
.*:任意長度的任意字符

位置錨定

^: 錨定行首,此字符后面的任意內容必須出現在行首
$: 錨定行尾,此字符前面的任意內容必須出現在行尾
^$: 空白行

LInux實際使用

由于linux系統shell解釋器的特殊處理,某些元字符在linux下具有展開式等特殊含義,在實際的使用過程中我們需要添加進行轉義。
?:匹配其前面的字符1次或0次;
+:匹配至少一次;
{m,n}:匹配其前面的字符至少m次,至多n次;
{1,}:匹配前面的字符至少1次;
{0,3}:匹配前面的字符0次至3次均可;

備注:至少0次,必須要顯示的寫出來;

<或:錨定詞首,其后面的任意字符必須作為單詞首部出現
>或:錨定詞尾,其前面的任意字符必須作為單詞的尾部出現

分組與后向引用

()
(ab)*
1:引用第1個左括號以及與之對應的括號所包括的所有內容;
2:引用第2個左括號以及與之對應的括號所包括的所有內容,以此類推;

二、拓展正則表達式

可以看到標準正則表達的使用過程中,許多符號都需要轉義,這在工作中帶來了一定的不便,因此擴展的正則表達式便出現了。

字符匹配:

.:匹配單個字符;
[abc]:包含abc任意一個字符
[^abc]:不包含abc任意一個字符

次數匹配(不用再轉義):

*:匹配前一個字符任意次;
?:匹配其前面的字符1次或0次;
+:匹配其前面的字符至少1次;
{m,n}:匹配其前面的字符至少m次,至多n次;

位置錨定:

對比使用方式:^和$
這里要注意的是對于詞首定位和詞尾定位,分別是,依然需要加上反斜杠;

分組(不用再轉義):

():分組
1,2,3:分別對應第n個括號所匹配的內容;

或運算

|: 可以同時取并集;

注意:C|cat表示的是C或cat(表示的是整個部分)

可以看到,使用擴展的正則表達式可以省略很多的轉義符號,這尤其在寫sed語句時極大的提高了代碼的可讀性。建議優先使用擴展的正則表達式。

三、grep命令家族

3.1. grep相關命令

grep命令家族由grep, egrep, fgrep 三個子命令組成,適用于不同的場景。具體如下:

命令描述

grep 原生的grep命令,使用“標準正則表達式”作為匹配標準。
egrep 擴展的grep命令,相當于$(grep -E),使用“擴展正則表達式”作為匹配標準。
fgrep 簡化版的grep命令,不支持正則表達式,但搜索速度快,系統資源使用率低。

3.2. 使用方法

語法
grep [options] PATTERN [FILE...]

options部分
-i:忽略大小寫
--color:高亮匹配上的字符串
-v: 顯示沒有被模式匹配到的行
-o:只顯示被模式匹配到的字符串
-E:使用擴展的正則表達式,egrep=grep -E

PATTERN部分
以字符串的方式給定匹配模板,可以使用普通字符串以及正則表達式(標準&擴展)。

FILE部分
需要查找內容的文件。

四、sed命令

4.1. 概述

sed全稱為Stream EDitor,sed是一個流編輯器,在處理行內容時功能十分強大。

4.2 基本語法

sed [option] 'script' [input file]...

1.option部分

-n:不輸出模式空間中未匹配上的內容stdout,詳情可以看4.3高級用法;
-e:可以在sed命令中指定多個script腳本,多點編輯功能;
-f:輸入sed腳本,腳本中寫著編輯命令;
-r:支持使用擴展的正則;
-i:直接編輯源文件;

2.script部分

script部分包含兩個內容,其一是定界,即確定我們要操作的范圍。另一個內容是操作,比如替換、插入當前行或在后面插入等操作。

a)定界-空地址

即全文編輯;

b)定界-單地址:

n:指定第n行,對特定行進行編輯;舉例:sed -n '1p' passwd僅輸出第一行;
/pattern/:指定模式匹配到的那一行,注意這里的pattern不是擴展正則表達式,如果要用擴展的正則表達式,需要在option需要使用-r;舉例:sed -n '/sbin/p' passwd輸出能夠匹配上sbin的內容行;

c)定界-范圍:

n,m:定位從第n行開始至第m行(都是閉區間);
n,+k:定位從第n行開始,包括往后的k行;
n,/pattern/:定位從第n行開始,至指定模式匹配到的那一行;
/pattern1/,/pattern2/:定位從pattern1模式匹配開始,直到pattern2模式匹配之間的范圍;

d)定界-步進方式:

1~2:以1為起始行,然后步進2行向下匹配,即所有的奇數行;
2~2:以2為起始行,然后步進2行向下匹配,即所有的偶數行;

e)編輯操作:

d:刪除整行,d放在定界后面。舉例:sed '/sbin/d' passwd;
p:顯示模式空間中的內容,p放在定界后面。一般來說,p操作和-n選項配合使用,篩選出我們匹配的行。若不加-n的話,由于模式空間中未匹配上的行也會輸出,我們會發現所有內容都輸出并且匹配行會輸出2次;
a:在匹配的行后面增加文本,使用 支持多行追加,a放在定界后面。舉例:sed '1a first_line second_line' passwd在第1行后面插入兩行內容(first_line 和 second_line);
i:在匹配的行前面增加文本,i放在定界后面。舉例:sed '3i hello' passwd;
c:替換匹配行為指定的文本。舉例:sed '/root/c text' passwd把匹配到的行替換成text;
w:保存模式空間中匹配的內容到指定位置。舉例:sed -n '/^[^#]/w /tmp/demo' /etc/fstab即將/etc/fstab中非#開頭的行輸出保存到/tmp/demo中。
r:讀取指定文件的內容添加到當前文件匹配到的行后面,進行文件合并。舉例:sed '2r /etc/passwd' 1.txt即將/etc/passwd文件的內容讀取,并插入到1.txt文件的第二行處。
!:條件取反。用法:地址定界!編輯命令。
s///:條件替換,這里的/可以用其他特殊符號,其替換分隔符的判定標準是s字符后的第一個特殊符號。這在替換文本中涉及特殊符號時特別好使,我們避開需要替換的特殊符號即可。即sed 's@root@me@g' /etc/passwd等同于sed 's/root/me/g' /etc/passwd。

替換標記備注:g(全局替換),p(顯示替換成功的行)
替換舉例:根據輸入查找目錄,下面輸出的是/var/log/
echo "/var/log/messages" | sed 's@[^/]+$/?@@'

4.3.sed高級用法

1.模式空間與保持空間

b914a494-1862-11f0-9310-92fbcf53809c.png

在模式空間中,完成匹配的操作。當沒有匹配上的時候,文本行內容會默認輸出stdout;當匹配上文本行的時候,會執行編輯命令,執行結果輸出到stdout中。
保持空間可以理解為一個暫存區,只是用于完成額外的動作。

2.相關參數

h:把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
g:把保持空間中的內容覆蓋至模式空間中;
G:把保持空間中的內容追加至模式空間中;
x:把模式空間中的內容與保持空間中的內容互換;
n:覆蓋讀取匹配到的行的下一行(改變指向)至模式空間中;
N:追加讀取匹配到的行的下一行(改變指向)至模式空間中;
d:刪除模式空間中的行;
D:刪除多行模式空間中的所有行;

3.舉例

sed -n 'n;p' FILE:顯示偶數行;
sed '1!G;h;$!d' FILE:逆序顯示文件的內容;
sed '$!d' FILE:取出最后一行;
sed '$!N;$!D' FILE:取出文件后兩行;
sed '/^$/d;G' FILE:刪除原有的所有空白行,而后為所有的非空白行后添加一個空白行;
sed 'n;d' FILE:顯示奇數行;
sed 'G' FILE:在原有的每行后方添加一個空白行;

4.基礎面試題舉例

面試題1:提取字符串中的指定字符串

/bin/bash
info="hellozimskyshenzhen"
echo$info| sed's/hello(w+)shenzhen/1/g'

注意事項:
sed中不支持d,如果要用數字用[0-9],但是支持w。
在一般正則表達式中,sed中的()要轉義,+要轉義,<>要使用轉義。如果不想這么麻煩,那就加上-r選項使用擴展正則表達式吧!

面試題2:判斷輸入是否為整數

#!/bin/bash
if[ -n"$(echo $1 | sed -n '/^[0-9]+$/p')"] ;then
echo'yes'
else
echo'no'
fi

五、awk命令

5.1. awk概述

awk是發明該工具三個作者姓名的首字母簡稱,awk是一個報表生成器,主要用于格式化輸出。格式化文本輸出器。

5.2. 基本用法

1.語法

awk [option] 'PATTERN{ACTION STATEMENTS}' FILE
awk按照行來讀取文檔,根據輸入分隔符切分成小部分(用內建變量來表示$0,$1,$2等),用ACTION STATEMENTS來處理該行文本。$0表示顯示整行。

2.常用選項option

-F:指名輸入字段的分隔符;
-v:用來實現自定義變量var=value;

3.PATTERN(用于定界)

``:表示處理文件的所有行;
/pattern/:表示處理正則匹配對應的行;
!/pattern/:表示處理正則不匹配的行;
關系表達式:比如NR>2等返回布爾類型的表達式。若結果為真則處理,假則不處理。對于非0非空字符串為真,其余為假。
n:表示處理第n行的文本,注意這里不支持直接給出數字的格式,例如1,2{...}。詳情請見舉例。
BEGIN/END模式:BEGIN{}表示僅在開始處理文件中的文本之前執行一次的程序,例如打印表頭。END{}表示文本處理完成之后執行一次,例如匯總數據。

舉例:
# 在/etc/passwd文件中,以:為分隔符,篩選出最后一列為/bin/bash的行,并打印第一列和最后一列
awk -F: '$NF=="/bin/bash" {print $1, $NF}' /etc/passwd
awk -F: '$NF!="/bin/bash"{print $1,$NF}' passwd
awk -F: '$3<1000 {print $1, $3}' /etc/passwd
awk -F; '(NR>=2&&NR<=10){print $1}' /etc/passwd 行定界
awk -F: '{printf "%-15s %10s
", $1, $2}' /etc/passwd

4.內建變量(在引用變量時不用加$)

FS:input field seperator:輸入字段分隔符,默認空白字符。也可使用-v指定。
OFS:輸出字段分隔符。使用-v指定。
RS:輸入時的換行符
ORS:輸出時的換行符
NF:number of field 每一行的字段數量。加上$NF表示最后一列。
NR:number of record 文件的行數,打印出來是打印行號
FNR:多個文件中的行數分別計數
FILENAME:當前文件的文件名
ARGC:參數命令行中參數的個數
ARGV:返回數組,命令行中的每個參數
舉例:awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/issue
在這里ARGV[0]是awk,固定為第0個參數。ARGV[1]是/etc/fstab,ARGV[2]是/etc/issue
舉例:awk -v FS=':' '{print $1}' -v OFS=':' /etc/passwd 指名冒號作為輸入的分隔符。同awk -F: ...

5.自定義變量

方法1:-v var=value (區分字符的大小寫)
方法2:在program中定義

舉例:awk -v test='hello' 'BEGIN {print test}'
awk 'BEGIN {test='hello' print test}'

6.常用的ACTION命令

?print
輸出格式:print item1,item2 ...
備注:使用逗號作為分隔符;輸出item可以是字符串、內建變量、awk表達式;若省略item,則顯示$0整行;

?printf
格式化輸出:printf FORMAT, item1, item2...按位放在format中。
注意事項:format必須要給出;如需換行,必須要顯示寫出;format中需要為后面每個item指定格式符;

? Expressions

? Control statements:控制語句if,while
if(condition){statement}
if(condition){statement} else {statements}
while(condition) {statements}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array刪除整個數組
exit 退出語句

? Compound statements:組合語句

? Input statements:輸入語句

? Output statements:輸出語句
格式符
%c:顯示字符的ASCII值
%d:顯示十進制整數
%e:科學計數法數值顯示
%f:顯示為浮點數
%g:以科學計數法顯示浮點數
%s:顯示字符串
%u:顯示無符號整數
%%:顯示%自身
修飾符
#[.#]:第一個數字用于控制顯示字符的寬度,第二個數字表示小數的精度(對于浮點數而言);輸出默認右對齊%15s,左對齊:%-15s;+:表示帶正負符號;
操作符
?算數操作符:+-/* ; +x把字符串轉換成數值;-x改成負數;
?字符串操作符:字符串連接(沒有操作符)
?復制操作符:=,+=,-=,/=,++,--
?比較操作符:>,<,<=,!=,==
模式匹配符
?:左側的字符串是否被模式匹配
?!:左側的字符串是否不能被模式匹配
邏輯操作符
?&&:與
?||:或
?!:非
函數調用
?function_name(arg1, arg2, ...)
條件表達式
?selector?true_exp:false_exp 和三目運算符一樣

? 操作例子

# 一般來說, 打印無狀態內容放在BEGIN和END塊中
awk -v begin="hello"-v end="ok"-F:'BEGIN{print begin}; {print $1, $NF}; END{print end}'/etc/passwd

5.3. awk高級用法及舉例

awk常用內置變量

$1:表示第一列
$NF:表示最后一列
$NR:表示行號

常用條件表示

1. /指定內容/
這種方式可以匹配到含有“指定內容”的行,在條件中不添加$#所帶的項,建議不使用正則,有異常情況。

awk -F:'/nologin/{print $0}'/etc/passwd#匹配到含有nologin關鍵字的行
seq100 | awk'/1/{print $1}'

2. $#=/指定內容/
這種方式指定第#列匹配指定內容

awk -F:'$1=/bin/{print $0}'/etc/passwd

3. $#~/指定內容/
這種方式用于指定列模糊匹配(正則匹配)指定內容,并獲取該行。

awk -F:'$1~/dae/{print $1}'/etc/passwd #正向選擇
awk -F:'$1!~/dae/{print $1}'/etc/passwd#反向選擇

4. 值判斷
使用>,<,>=,<=,==,!=來判斷指定列的值。

awk -F:'$3>=10{print $1}'/etc/passwd

5. 邏輯判斷
使用&&,||來進行邏輯判斷。

awk -F:'$3>=5 && $3<=10{print $1}'?/etc/passwd

6. if條件判斷

awk -F:'{if ($NF~/nologin$/){i++}else{j++}}; END{print i, j}'/etc/passwd
#注意if-else條件判斷是放在{}中的

7. 字典使用
在awk中可以定義數組類型,用于統計。

awk'{ip[$1]++}; END{for (i in ip) {print i, ip[i]}}'access.log
#解析: 將第一列ip設置為字典的key,當出現一次相同的ip時自增1,用于統計所有的ip計數。
#for循環中取到每個字典對應的key,再使用print塊打印出來。注意花括號的隔離。
#QQ號 等級 時長
#統計等級(30<=x<=90),相同賬號的時長
#1234 12 23
#1234 10 122
#1233 92 4212
#1233 42 4252
#1239 87 2313
#1233 56 1121
#1231 19 45
#1235 45 679

cat?data | awk?'$2>=30&&$2<=90{dic[$1]+=$3}; END{for (i in dic) {print i, dic[i]}}'

鏈接:https://www.cnblogs.com/hiyong/p/14238392.html

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11416

    瀏覽量

    212268
  • Linux系統
    +關注

    關注

    4

    文章

    601

    瀏覽量

    28147
  • 字符串
    +關注

    關注

    1

    文章

    589

    瀏覽量

    20951
  • 正則表達式
    +關注

    關注

    0

    文章

    28

    瀏覽量

    3626

原文標題:Linux三劍客:文本處理的強大工具,讓數據處理效率提升10倍

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    詳解Linux Shell文本處理工具

      今天給大家分享日常工作中常用到的shell文本處理工具,可以說是史上最全了,大家掌握住這些工具,可以在日常運維工作中起到事半功倍的作用!
    發表于 10-27 09:19 ?592次閱讀

    Linux中grep、sed和awk命令詳解

    今天給大家聊一聊Linux中文本操作的`三劍客:awk、grep、sed`,因其功能強大、使用頻繁,且是Linux文本處理的得力利器,常被稱之為`
    發表于 04-26 17:20 ?3487次閱讀
    <b class='flag-5'>Linux</b>中grep、sed和awk<b class='flag-5'>命令</b>詳解

    Linux中sed命令用法

    這篇文章為初學者提供了關于 Linux 中 sed 命令的全面指南,涵蓋了其歷史、用途以及一些實用的技巧和竅門。通過掌握 sed,您可以高效處理文本處理任務,這對于任何使用
    發表于 07-21 10:38 ?456次閱讀
    <b class='flag-5'>Linux</b>中sed<b class='flag-5'>命令</b><b class='flag-5'>用法</b>

    使用 Linux/Unix 進行文本處理

    使用 Linux/Unix 進行文本處理正則表達式 翻譯領域不乏讓人摸不著頭腦的詞匯,比如"句柄"、"套接字"、"魯棒性"。當然
    發表于 11-24 15:39

    shell文本處理方法是什么

    shell文本處理三劍客—grep
    發表于 05-27 12:32

    易語言-文本處理

    易語言是一門以中文作為程序代碼編程語言學習例程:易語言-文本處理
    發表于 06-06 17:43 ?1次下載

    Python網頁爬蟲,文本處理,科學計算,機器學習和數據挖掘工具集

    本文檔的主要內容詳細介紹的是Python工具包合集包括了:網頁爬蟲工具集,文本處理工具集,Python科學計算工具包,Python機器學習和數據挖掘 工具包
    發表于 09-07 17:14 ?39次下載
    Python網頁爬蟲,<b class='flag-5'>文本處理</b>,科學計算,機器學習和數據挖掘工具集

    總結Linux中用于文本處理的awk、sed、grep命令用法

    段.? 這似乎把文件記錄看成數據庫. 但是, awk仍然以行為單位逐行處理. 本例子以下面的文件(命名為s.txt)內容做演示:?復制代碼代碼如下:zhangsan 1977 male computer
    發表于 04-02 14:32 ?511次閱讀

    簡述Linux文本查看命令

    Linux 常用命令中,除了 cat 還有很多其他用于文本查看的命令。
    的頭像 發表于 08-11 11:17 ?3874次閱讀

    Linux中的Grep正則表達式詳細資料說明

    grep是Linux中用于文本處理的最有用和功能最強大的命令之一。 grep在一個或多個輸入文件中搜索與正則表達式匹配的行,并將每條匹配的行寫入標準輸出。
    的頭像 發表于 06-21 11:39 ?2309次閱讀

    Linux系統中的10個常用的文本查看命令

    Linux文本查看命令及其詳細說明和使用示例。 cat 命令 cat 命令是最基本的讀取文本
    的頭像 發表于 06-24 11:44 ?1.1w次閱讀

    單日獲客成本超20萬,國產大模型開卷200萬字以上的長文本處理

    更精準的推理和高并發流量以外,似乎已經沒有太多值得廠商大肆宣傳的特性了,直到最近超長文本處理的爆火。 ? 國產大模型的新卷法,長文本處理 ? 當下將大模型長文本處理炒熱的,無疑是來自月之暗面的Kimi。作為去年發布的大模型,Ki
    的頭像 發表于 03-27 00:53 ?3696次閱讀
    單日獲客成本超20萬,國產大模型開卷200萬字以上的長<b class='flag-5'>文本處理</b>

    Linux中cut命令的實用示例

    Linux command cut 用于文本處理。您可以使用此命令通過選擇列從文件中提取部分文本。
    的頭像 發表于 08-05 15:14 ?487次閱讀

    如何掌握Linux文本處理

    /from/sed_script: 從指定的文本中讀取處理腳本 -r: 使用擴展正則表達式 sed命令選項 替換標記 g:表示行內全面替換 w:表示把行寫入一個文件 x:表示互換模式
    的頭像 發表于 11-10 13:40 ?381次閱讀

    Linux三劍客之Sed:文本處理神器

    關于linux三劍客 grep,過濾關鍵字信息數據。主要是用于查文本內的數據 sed ,對文本數據進行編輯,修改原文件內容 awk,對文件數據過濾,提取,并且能實現,格式化輸出 awk對文件數據
    的頭像 發表于 12-16 15:58 ?553次閱讀
    <b class='flag-5'>Linux</b>三劍客之Sed:<b class='flag-5'>文本處理</b>神器
    主站蜘蛛池模板: 色www永久免费视频 色y情视频免费看 | 黄色大片视频在线观看 | 天天夜夜啦啦啦 | 性香港xxxxx免费视频播放 | 性夜影院爽黄a爽免费视频 性瘾高h姚蕊全文免费阅读 | 欧美日本视频一区 | 亚洲精品久久久久久久蜜桃 | 午夜免费看片 | 天天干夜夜做 | 国产农村妇女毛片精品久久 | 国产成人精品免费视频大全可播放的 | 久久黄色精品视频 | 欧美色综合久久 | 美女视频久久 | 在线天堂bt中文www在线 | 免费又爽又黄禁片视频在线播放 | 性色在线视频 | 一区二区三区免费精品视频 | 99久久精品99999久久 | 奇米7777第四色 | 国产色婷婷精品综合在线手机播放 | 丁香花五月天婷婷 | 国产69精品久久 | 婷婷 夜夜| www爽| 99久久综合给久久精品 | 亚欧免费视频 | 喷潮白浆| 午夜视频色 | xxxx日本69xxxxx | 午夜一级毛片免费视频 | 日本污视频 | 一级做a爰片久久毛片图片 一级做a爰片久久毛片鸭王 | 精品女同同性视频很黄很色 | 免费一级特黄 欧美大片 | 黄色伊人 | 色偷偷综合 | 乱人伦xxxx国语对白 | 免费一级毛片在线播放 | 午夜影院美女 | 久久性生活 |