1. 程式人生 > >快收藏!史上最全的 Linux Shell 文字處理工具集錦

快收藏!史上最全的 Linux Shell 文字處理工具集錦

640?wx_fmt=png&wxfrom=5&wx_lazy=1

本文將介紹Linux下使用Shell處理文字時最常用的工具:

find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;

提供的例子和引數都是最常用和最為實用的;

我對shell指令碼使用的原則是命令單行書寫,儘量不要超過2行;

如果有更為複雜的任務需求,還是考慮python吧;

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

請點選此處輸入圖片描述

find 檔案查詢

  • 查詢txt和pdf檔案

  find . ( -name "*.txt" -o -name "*.pdf" ) -print

  • 正則方式查詢.txt和pdf

  find . -regex  ".*(.txt|.pdf)$"

-iregex: 忽略大小寫的正則

  • 否定引數

       查詢所有非txt文字

   find . ! -name "*.txt" -print

  • 指定搜尋深度

       打印出當前目錄的檔案(深度為1)

  find . -maxdepth 1 -type f  

定製搜尋

  • 按型別搜尋:

  find . -type d -print  //只列出所有目錄

-type f 檔案 / l 符號連結

  • 按時間搜尋:

-atime 訪問時間 (單位是天,分鐘單位則是-amin,以下類似)

-mtime 修改時間 (內容被修改)

-ctime 變化時間 (元資料或許可權變化)

  • 最近7天被訪問過的所有檔案:

 find . -atime 7 -type f -print

  • 按大小搜尋:

       w字 k M G

       尋找大於2k的檔案

 find . -type f -size +2k

按許可權查詢:

  find . -type f -perm 644 -print //找具有可執行許可權的所有檔案

按使用者查詢:

  find . -type f -user weber -print// 找使用者weber所擁有的檔案

找到後的後續動作

  • 刪除:

刪除當前目錄下所有的swp檔案:

  find . -type f -name "*.swp" -delete

  • 執行動作(強大的exec)

  find . -type f -user root -exec chown weber {} ; //將當前目錄下的所有權變更為weber

注:{}是一個特殊的字串,對於每一個匹配的檔案,{}會被替換成相應的檔名;

eg:將找到的檔案全都copy到另一個目錄:

  find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD ;

  • 結合多個命令

tips: 如果需要後續執行多個命令,可以將多個命令寫成一個指令碼。然後 -exec 呼叫時執行指令碼即可;

  -exec ./commands.sh {} ;

-print的定界符

預設使用' '作為檔案的定界符;

-print0 使用''作為檔案的定界符,這樣就可以搜尋包含空格的檔案;

grep 文字搜尋

grep match_patten file // 預設訪問匹配行

  • 常用引數

-o 只輸出匹配的文字行 VS -v 只輸出沒有匹配的文字行

-c 統計檔案中包含文字的次數

  grep -c "text" filename

-n 列印匹配的行號

-i 搜尋時忽略大小寫

-l 只打印檔名

  • 在多級目錄中對文字遞迴搜尋(程式設計師搜程式碼的最愛):

  grep "class" . -R -n

  • 匹配多個模式

  grep -e "class" -e "vitural" file

  • grep輸出以作為結尾符的檔名:(-z)

  grep "test" file* -lZ| xargs -0 rm

xargs 命令列引數轉換

xargs 能夠將輸入資料轉化為特定命令的命令列引數;這樣,可以配合很多命令來組合使用。比如grep,比如find;

  • 將多行輸出轉化為單行輸出

cat file.txt| xargs

是多行文字間的定界符

  • 將單行轉化為多行輸出

cat single.txt | xargs -n 3

-n:指定每行顯示的欄位數

xargs引數說明

-d 定義定界符 (預設為空格 多行的定界符為 )

-n 指定輸出為多行

-I {} 指定替換字串,這個字串在xargs擴充套件時會被替換掉,用於待執行的命令需要多個引數時

eg:

cat file.txt | xargs -I {} ./command.sh -p {} -1

-0:指定為輸入定界符

eg:統計程式行數

find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l

sort 排序

欄位說明:

-n 按數字進行排序 VS -d 按字典序進行排序

-r 逆序排序

-k N 指定按第N列排序

eg:

sort -nrk 1 data.txt

sort -bd data // 忽略像空格之類的前導空白字元

uniq 消除重複行

  • 消除重複行

  sort unsort.txt | uniq 

  • 統計各行在檔案中出現的次數

  sort unsort.txt | uniq -c

  • 找出重複行

  sort unsort.txt | uniq -d

可指定每行中需要比較的重複內容:-s 開始位置 -w 比較字元數

用tr進行轉換

  • 通用用法

  echo 12345 | tr '0-9' '9876543210' //加解密轉換,替換對應字元

  cat text| tr ' ' ' '  //製表符轉空格

  • tr刪除字元

  cat file | tr -d '0-9' // 刪除所有數字

  • -c 求補集

  cat file | tr -c '0-9' //獲取檔案中所有數字

  cat file | tr -d -c '0-9 '  //刪除非數字資料

  • tr壓縮字元

tr -s 壓縮文字中出現的重複字元;最常用於壓縮多餘的空格

  cat file | tr -s ' '

  • 字元類

tr中可用各種字元類:

alnum:字母和數字

alpha:字母

digit:數字

space:空白字元

lower:小寫

upper:大寫

cntrl:控制(非可列印)字元

print:可列印字元

使用方法:tr [:class:] [:class:]

  eg: tr '[:lower:]' '[:upper:]'

cut 按列切分文字

  • 擷取檔案的第2列和第4列:

  cut -f2,4 filename

  • 去檔案除第3列的所有列:

  cut -f3 --complement filename

  • -d 指定定界符:

  cat -f2 -d";" filename

  • cut 取的範圍

N- 第N個欄位到結尾

-M 第1個欄位為M

N-M N到M個欄位

  • cut 取的單位

-b 以位元組為單位

-c 以字元為單位

-f 以欄位為單位(使用定界符)

  • eg:

  cut -c1-5 file //列印第一到5個字元

  cut -c-2 file  //列印前2個字元

paste 按列拼接文字

將兩個文字按列拼接到一起;

cat file1

1

2

cat file2

colin

book

paste file1 file2

1 colin

2 book

預設的定界符是製表符,可以用-d指明定界符

paste file1 file2 -d ","

1,colin

2,book

wc 統計行和字元的工具

wc -l file // 統計行數

wc -w file // 統計單詞數

wc -c file // 統計字元數

sed 文字替換利器

  • 首處替換

  seg 's/text/replace_text/' file   //替換每一行的第一處匹配的text

  • 全域性替換

   seg 's/text/replace_text/g' file

  • 預設替換後,輸出替換後的內容,如果需要直接替換原檔案,使用-i:

  seg -i 's/text/repalce_text/g' file

  • 移除空白行:

  sed '/^$/d' file

  • 變數轉換

已匹配的字串通過標記&來引用.

echo this is en example | seg 's/w+/[&]/g'

$>[this]  [is] [en] [example]

  • 子串匹配標記

第一個匹配的括號內容使用標記  來引用

  sed 's/hello([0-9])//'

  • 雙引號求值

sed通常用單引號來引用;也可使用雙引號,使用雙引號後,雙引號會對錶達式求值:

  sed 's/$var/HLLOE/' 

當使用雙引號時,我們可以在sed樣式和替換字串中指定變數;

eg:

p=patten

r=replaced

echo "line con a patten" | sed "s/$p/$r/g"

$>line con a replaced

  • 其它示例

字串插入字元:將文字中每行內容(PEKSHA) 轉換為 PEK/SHA

  sed 's/^.{3}/&//g' file

awk 資料流處理工具

  • awk指令碼結構

awk ' BEGIN{ statements } statements2 END{ statements } '

  • 工作方式

1.執行begin中語句塊;

2.從檔案或stdin中讀入一行,然後執行statements2,重複這個過程,直到檔案全部被讀取完畢;

3.執行end語句塊;

print 列印當前行

  • 使用不帶引數的print時,會列印當前行;

  echo -e "line1 line2" | awk 'BEGIN{print "start"} {print } END{ print "End" }' 

  • print 以逗號分割時,引數以空格定界;

echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3";

print var1, var2 , var3; }'

$>v1 V2 v3

  • 使用-拼接符的方式(""作為拼接符);

echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3";

print var1"-"var2"-"var3; }'

$>v1-V2-v3

特殊變數: NR NF $0 $1 $2

NR:表示記錄數量,在執行過程中對應當前行號;

NF:表示欄位數量,在執行過程總對應當前行的欄位數;

$0:這個變數包含執行過程中當前行的文字內容;

$1:第一個欄位的文字內容;

$2:第二個欄位的文字內容;

echo -e "line1 f2 f3 line2 line 3" | awk '{print NR":"$0"-"$1"-"$2}'

  • 列印每一行的第二和第三個欄位:

  awk '{print $2, $3}' file

  • 統計檔案的行數:

  awk ' END {print NR}' file

  • 累加每一行的第一個欄位:

  echo -e "1 2 3 4 " | awk 'BEGIN{num = 0 ;

  print "begin";} {sum += $1;} END {print "=="; print sum }'

傳遞外部變數

var=1000

echo | awk '{print vara}' vara=$var #  輸入來自stdin

awk '{print vara}' vara=$var file # 輸入來自檔案

用樣式對awk處理的行進行過濾

awk 'NR < 5' #行號小於5

awk 'NR==1,NR==4 {print}' file #行號等於1和4的打印出來

awk '/linux/' #包含linux文字的行(可以用正則表示式來指定,超級強大)

awk '!/linux/' #不包含linux文字的行

設定定界符

使用-F來設定定界符(預設為空格)

awk -F: '{print $NF}' /etc/passwd

讀取命令輸出

使用getline,將外部shell命令的輸出讀入到變數cmdout中;

echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout }' 

在awk中使用迴圈

for(i=0;i<10;i++){print $i;}

for(i in array){print array[i];}

eg:

以逆序的形式列印行:(tac命令的實現)

seq 9|

awk '{lifo[NR] = $0; lno=NR}

END{ for(;lno>-1;lno--){print lifo[lno];}

} '

awk實現head、tail命令

  • head:

  awk 'NR<=10{print}' filename

  • tail:

  awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){

  print buffer[i %10]} } ' filename

列印指定列

  • awk方式實現:

  ls -lrt | awk '{print $6}'

  • cut方式實現

  ls -lrt | cut -f6

列印指定文字區域

  • 確定行號

  seq 100| awk 'NR==4,NR==6{print}'

  • 確定文字

列印處於start_pattern 和end_pattern之間的文字;

  awk '/start_pattern/, /end_pattern/' filename

eg:

seq 100 | awk '/13/,/15/'

cat /etc/passwd| awk '/mai.*mail/,/news.*news/'

awk常用內建函式

index(string,search_string):返回search_string在string中出現的位置

sub(regex,replacement_str,string):將正則匹配到的第一處內容替換為replacement_str;

match(regex,string):檢查正則表示式是否能夠匹配字串;

length(string):返回字串長度

echo | awk '{"grep root /etc/passwd" | getline cmdout; print length(cmdout) }' 

printf 類似c語言中的printf,對輸出進行格式化

eg:

seq 10 | awk '{printf "->%4s ", $1}'

迭代檔案中的行、單詞和字元

1. 迭代檔案中的每一行

  • while 迴圈法

while read line;

do

echo $line;

done < file.txt

改成子shell:

cat file.txt | (while read line;do echo $line;done)

  • awk法:

cat file.txt| awk '{print}'

2.迭代一行中的每一個單詞

for word in $line;

do 

echo $word;

done

3. 迭代每一個字元

${string:start_pos:num_of_chars}:從字串中提取一個字元;(bash文字切片)

${#word}:返回變數word的長度

for((i=0;i<${#word};i++))

do

echo ${word:i:1);

done

本文為《linux Shell指令碼攻略》的讀書筆記,文中主要內容和示例來自於

《linux Shell指令碼攻略》

分享朋友圈 也是另一種讚賞

The more we share, The more we have

歡迎加入資料君高效資料分析社群

加我私人微信進入大資料乾貨群:tongyuannow 

640?wx_fmt=jpeg

目前100000+人已關注加入我們

640.jpeg? 0.gif? 0.gif? 0.gif? 0.gif? 0.gif? 0.gif? 0.gif?

0.gif? 0.gif? 0.gif? 

相關推薦

收藏Linux Shell 文字處理工具集錦

本文將介紹Linux下使用Shell處理文字時最常用的工具:find、grep、xargs、so

馬上收藏正則表示式合集

一.校驗數字 數字:^[0-9]*$ n位的數字:^\d{n}$ 至少n位的數字:^\d{n,}$ m-n位的數字:^\d{m,n}$ 零和非零開頭的數字:^(0|[1-9][0-9]*)$ 非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*

Linux Shell 文字處理工具集錦(重點推薦)

        依稀記得某人曾今問過關於linux中的高階用法,當時覺得一臉懵逼,後來才發現,所謂的高階用法,無非是可以被python替換的shell基礎指令碼,及處理10GB資料量以下的linux基礎命令。現在看到了就整理了一下。 1.shell特殊符號

Linux提權後獲取敏感信息方法

ron tables 快速 結果 my.conf faillog suid rmi rem http://www.freebuf.com/articles/system/23993.html 在本文開始之前,我想指出我不是專家。據我所知,在這個龐大的區域,沒有一個“神奇”

【原創】驚的select加鎖分析(Mysql)

引言 大家在面試中有沒遇到面試官問你下面六句Sql的區別呢 select * from table where id = ? select * from table where id < ? select * from table where id = ? lock in share mode sele

分享抖音熱門技巧的抖音短視訊漲粉、運營攻略

  最近和朋友聊天,大家都不約而同的提到抖音這個神奇的物種,很多人都搞不懂抖音到底是個什麼東西,為什麼能這麼火?   抖音是一個關於美好的短視訊APP   不同於快手的獵奇和稍微低俗的流量,抖音是一個記錄“美好”的產品,美好是什麼?每個人都想成為想象中的美好

Linux發行版進化編年史

自從Linus Torvalds創造了Linux系統之後,Linux就成為全世界計算機頂尖人才的寵兒。在20多年的發展歷程中,Linux出現了數以百計的發行版,過於龐大的數量造成一系列麻煩,即使是Linux研究專家也會在面對這些發行版時對它們之間錯綜複雜的年代關係感到頭疼。本

零基礎java的福音精簡的學習路線圖

最全 java 想要 零基礎 視頻 .com 技術 分享 二維 這是一個java系統學習路線,從零基礎到項目框架開發,每一個階段裏面內容都標記的很清楚,如果你現在也在學習java,你可以跟著這個系統學習路線學,學完自己可以獨立的完成項目

告別編碼5分鐘,命名2小時的Java命名規範參考

簡潔清爽的程式碼風格應該是大多數工程師所期待的。在工作中筆者常常因為起名字而糾結,誇張點可以說是程式設計5分鐘,命名兩小時!究竟為什麼命名成為了工作中的攔路虎。 每個公司都有不同的標準,目的是為了保持統一,減少溝通成本,提升團隊研發效能。所以本文中是筆者結合阿里巴巴開發規範,以及工作中的見聞針對Java領域相

的Android開發學習教程集錦【初學者】

根據Google的報告,截止2017年5月為止,Android活躍使用者已超過20億,並還在持續增長中。Android系統在幾個主要的市場上已超過了iOS系統,特別是在美國,歐洲和日本,然而蘋果確實在中國市場找到了一席之地。未來的市場到底誰是“霸主”我們還無從得知,但Andr

運維是做什麽的?互聯網Linux工作規劃十分鐘找到linux運維工程師職業方向

Linux Linux運維 首先祝賀你選擇學習Linux,你可能即將踏上Linux的工作之旅,出發之前,讓我帶你來看一看關於Linux和Linux運維的一切。Linux因其高效率、易於裁剪、應用廣等優勢,成為了當今中高端服務器的主要操作系統,並且處於一個不可替代的地位。Linux可安裝在各種計算機硬件

收藏起來,的 MySQL 高效能優化實戰總結

摘要: 一、前言 MySQL 對於很多 Linux 從業者而言,是一個非常棘手的問題,多數情況都是因為對資料庫出現問題的情況和處理思路不清晰。在進行 MySQL 的優化之前必須要了解的就是 MySQL 的查詢過程,很多的查詢優化工作實際上就是遵循一些原則讓MySQL 的優化器能夠按照預想的

linux命令詳解,

linux常用命令總結,歡迎轉載 一.咿咿呀呀階段    首先先教你們四個熱鍵,學會這四個鍵,收益一輩子。     Tab按鍵---命令補齊功能     Ctrl+c按鍵---停掉正在執行的程式  

Java面試題(帶全部答案,你可能要收藏

原文地址:前幾天,有朋友去面試之前問我關於後端架構相關的問題,但奈於我去年更多的工作是在移動SDK開發上,對此有所遺忘,實屬無奈,後面準備總結下.今天要談的主題是關於求職.求職是在每個技術人員的生涯中都要經歷多次,對於我們大部分人而言,在進入自己心儀的公司之前少不了準備工作,

每個程式設計師必須知道的學習網站收藏太多了

Pramp | 軟體工程師自由點播的面試實踐平臺 :與真正的同行練習程式設計師的面試。 GeeksforGeeks | 給極客的電腦科學入口網站 : 同時訂閱他們的提要以獲得新文章的連結。 一個網站,關注術面試問題、腦筋急轉彎、難題、怪題 : 那是些什麼見鬼的東西,還有其他讓你思考的東西! 問題集 |

Linux基礎管理——軟件包管理:rpm,yum高級使用方法(,沒有之一)

rpm yum 軟件包管理 yum倉庫 yum源地址配置 前言: GRU Linux操作系統中,實現軟件包管理的常見工具有RPM和yum;本專題將就Centos系統中安裝包的命名、校驗、密鑰導入導出、包安裝、卸載、升級、查詢等眾多rpm包管理相關的操作實現進行總結。1、安裝包1.1、

Python的高級特效是什麽?有什麽用呢?的教程

val decorator itertools 異常 最全的 運行時 factory tor rfi 本篇文章重點介紹以下內容 Python語言的一些高階用法主要有以下幾個特性: generators生成器用法 collections包常見用法 itertoo

Python從入門到資深書籍資料分享

暢銷書 jpeg 集成 mar sha 鞏固 技能 ima 能力 今天我來為大家分享十本不可錯過的Python好書,分別適合入門、進階到精深三個不同階段的人來閱讀。 Python高性能編程 Amazon 五星暢銷書。 Python 入門進階必讀。 Python代碼僅僅能夠

解析大數據在十大行業的應用

作用 方向 風險 追蹤 谷歌地圖 收集 合規 個人 所有 什麽是大數據?這次我們不談概念,不談理論,避虛就實,關註大數據在十大行業的實際應用。從證券行業到醫療領域,越來越多公司意識到大數據的重要性。2015年Gartner調查顯示,超過75%的公司正在投資或計劃在未來兩年內