linux的awk和sed等命令比較

2021-08-14 21:22:03 字數 4375 閱讀 8425

對於文字的操作分為兩種操作,一種是按行操作,一種是按列操作。

簡單的命令有grep(行操作)和cut(列操作)。

複雜點的有sed(行操作)和awk(列操作)。

樣例文字

hello tom

hi marry

how are you

什麼是行操作:簡單的例子就是,獲取上面文字中帶有hello的行就是行操作。

什麼是列操作:簡單的例子就是獲取上面文字中的第一列操作。

package com.zzrenfeng.linux;

/** * grep命令

* *@author hanlipeng

* */

public

class

grep b 字母a出現兩次

* a\b 至少出現兩次

* a\b 出現2到4次

* [0-9]\xx[0-9]\ 前四個是數字,中間是xx,後四個是數字

* * 簡單實用

* 過濾出行裡面有hello的行

* grep 'hello' filename.txt

* * 過濾出所有行裡面不含hello的行

* grep -v 'hello' filename.txt

* */

}

package com.zzrenfeng.linux;

/** * cut用法

* 命令可以從乙個文字檔案或者文字流中提取文字列。

* * sort wc uniq

*@author rf

* */

public

class

cut

package com.zzrenfeng.linux;

/** *

*@author hanlipeng

* */

public

class

sed

package com.zzrenfeng.linux;

/** * awk是乙個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

* * @author hanlipeng

* */

public class awk '

* * 如果只是顯示/etc/passwd的賬戶

* cat /etc/passwd |awk -f

':'''

* * 如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割

* cat /etc/passwd |awk -f

':'''

* * 如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行新增列名name,shell,在最後一行新增"blue,/bin/nosh"。

* cat /etc/passwd |awk -f

':''begin end '

* * 搜尋/etc/passwd有root關鍵字的所有行

* awk -f: '/root/' /etc/passwd

* * 搜尋支援正則,例如找root開頭的: awk -f: '/^root/' /etc/passwd

* * 搜尋/etc/passwd有root關鍵字的所有行,並顯示對應的shell

* awk -f: '/root/' /etc/passwd

* * awk內建變數

* awk有許多內建變數用來設定環境資訊,這些變數可以被改變,下面給出了最常用的一些變數。

* *

* argc 命令列引數個數

* argv 命令列引數排列

* environ 支援佇列中系統環境變數的使用

* filename awk瀏覽的檔名

* fnr 瀏覽檔案的記錄數

* fs 設定輸入域分隔符,等價於命令列 -f選項

* nf 瀏覽記錄的域的個數

* nr 已讀的記錄數

* ofs 輸出域分隔符

* ors 輸出記錄分隔符

* rs 控制記錄分隔符

* * 統計/etc/passwd:檔名,每行的行號,每行的列數,對應的完整行內容:

* * #awk -f ':' '' /etc/passwd

* filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash

* filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh

* filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh

* filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

* *

* 使用printf替代print,可以讓**更加簡潔,易讀

* awk -f

':''' /etc/passwd

* *

* * 高階awk程式設計

* 除了awk的內建變數,awk還可以自定義變數

* * 下面統計/etc/passwd的賬戶人數

* awk ' end' /etc/passwd

* root:x:0:0:root:/root:/bin/bash

* ......

* user count is 40

* * 這裡沒有初始化count,雖然預設是0,但是妥當的做法還是初始化為0:

* awk 'begin end' /etc/passwd

* [start]user count is 0

* root:x:0:0:root:/root:/bin/bash

* ...

* [end]user count is 40

* *

* 統計某個資料夾下的檔案占用的位元組數

* ls -l |awk 'begin end'

* [end]size is 8657198

* * * 如果以m為單位顯示:

* ls -l |awk 'begin end'

* [end]size is 8.25889 m

* 注意,統計不包括資料夾的子目錄。

* *

*//**

* 條件語句以後需要了再進行學習

if (expression)

if (expression) else

if (expression) else

if (expression1) else

統計某個資料夾下的檔案占用的位元組數,過濾4096大小的檔案(一般都是資料夾):

ls -l |awk 'begin } end'

[end]size is 8.22339 m

迴圈語句

awk中的迴圈語句同樣借鑑於c語言,支援while、do/while、for、break、continue,這些關鍵字的語義和c語言中的語義完全相同。

陣列 因為awk中陣列的下標可以是數字和字母,陣列的下標通常被稱為關鍵字(key)。值和關鍵字都儲存在內部的一張針對key/value應用hash的**裡。由於hash不是順序儲存,因此在顯示陣列內容時會發現,它們並不是按照你預料的順序顯示出來的。陣列和變數一樣,都是在使用時自動建立的,awk也同樣會自動判斷其儲存的是數字還是字串。一般而言,awk中的陣列用來從記錄中收集資訊,可以用於計算總和、統計單詞以及跟蹤模板被匹配的次數等等。

顯示/etc/passwd的賬戶

awk -f

':''begin ; end' /etc/passwd

0 root

1 daemon

2 bin

3 sys

4 sync

5 games

......

這裡使用for迴圈遍歷陣列

*/}

linux下sed 和 awk用法

常用選項 常用命令 刪除某行 root localhost ruby sed 1d ab 刪除第一行 root localhost ruby sed d ab 刪除最後一行 root localhost ruby sed 1,2d ab 刪除第一行到第二行 root localhost ruby s...

sed 和 awk 的運用

n 遮蔽預設輸出,預設sed會輸出讀取文件的全部內容 r 讓sed支援擴充套件正則 i sed直接修改原始檔,預設sed只是通過記憶體臨時修改檔案,原始檔無影響 sed n 3,6p etc passwd 答案 sed i s usr local usr src g file 答案 awk home...

awk和sed的常規用法

sed 的用法 sed編輯器稱作stream editor。如vim則是互動式文字編輯器。流編輯器就是在處理資料之前基於預先提供的一組規則來編輯資料。1.一次從輸入中讀取一行資料 2.根據所提供的編輯器命令匹配資料 3.按照命令修改流中的資料 4.將新的資料輸出到stdout 命令格式 set op...