天天看點

Linux管道指令

    Linux中常用檔案字元串分析的指令

在linux中檔案管理與系統管理的方面,經常會用到要從一個檔案中或者一長串字元串中提取你所需要的資料,或者某些字段來進行檢視或者分析,作為一個初級linux小菜鳥,我大體總結整理了幾個常用的分析指令,希望能互相交流與探讨下。

主要是管道指令中的幾個指令: grep,sed,awk,cut,wc,split,printf

由于篇幅有限,僅僅對每個指令常用的方法進行列舉

資料流重定位:

1.标準輸入:代碼為0,使用<或者<<

2.标準輸出:代碼為1,使用>或者>>

3.标準錯誤輸出:代碼為2,使用2>或者2>>

輸出中,>和2>當檔案不存在則建立一個新的,否則就先清空檔案内容,再将資料寫入。

>>和2>>當檔案不存在則建立新的,否則就将内容追加到原來的檔案上。

例如ll /home >test 2>&1,這是一種把錯誤資訊和正确内容同時輸入到一個檔案中。

輸入中:cat > test,這個可以在指令行中輸入内容,且最終将結果寫入到test檔案中,使用ctrl+d結束。

cat >cattest < ~/test,将test的内容直接寫到cattest中,

cat >cattest <<"1",代表當遇到這個字元1的時候停止輸入。

管道指令的基本用法

command1 | command2 | command3

管道指令可以直接在”|” 後面直接使用,也可以直接後面接要操作的檔案資料名

1, grep

它主要是将給定的字元串在要進行比對的檔案資料中,進行字元串的查找,将符合條件的字元串列印出來,它主要是以行為機關進行處理的,最後以整行為機關來進行顯示。

格式:

grep [-cinv] [-A] [-B] pattern filename 

參數說明:

-c : 隻輸出比對的總次數

-i : 忽略大小寫 

-n : 僅僅顯示比對的行号,及比對的行 

-v : 反向選擇,顯示沒有keyword的行

-A: 後面加數字,為after,除了列出比對的行,再将後續的n行列出來

-B: 後面加數字,為before,除了列出比對的行,再将前面的n行列出來

Pattern為具體的要查找的字元串,如“root”或者是“正規表達式”

正規表達式:

^word 待查找的word在行首

word$ 待查找的word在行尾

. 代表任意一個字元

* 重複前一個字元0到無窮多次

[abc] 從字元集合中選取一個,僅僅有其中一個,即a或者b或者c

[n1-n2] ,從字元集合的選取範圍内查屬于其中的一個字元

[^list] 不屬于該字元串的範圍的字元

\{n,m\}, 連續n到m個前一個字元

^$ 代表的是空行号

example:

#擷取行首字元為the的行

grep -n '^the' filename

#擷取一個任意f???d字元串,使用三個.

Grep -n 'f...d' filename

#擷取至少有2個“e”的字元,如feed,geeed

grep -n ‘feee*d’ filename

#擷取一個空行号

grep -n '^$' filename

檢視比對的前後行

grep -5 'parttern' inputfile //列印比對行的前後5行

grep -C 5 'parttern' inputfile //列印比對行的前後5行

grep -A 5 'parttern' inputfile //列印比對行的後5行

grep -B 5 'parttern' inputfile //列印比對行的前5行

2,sed

sed 是一種線上編輯器,它一次處理一行内容。處理時,把目前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接着用sed指令處理緩沖區中的内容,處理完成後,把緩沖區的内容送往螢幕。接着處理下一行,這樣不斷重複,直到檔案末尾。檔案内容并沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個檔案;簡化對檔案的反複操作;編寫轉換程

主要用來對資料進行替換,删除,新增,選取特定行,它主要是以行為機關的

sed [-nefr] [[n1[,n2]] function] 

參數說明: 

-n : 使用安靜(silent)模式,預設況下所有來自STDIN的資料都會顯示在螢幕上,

加上-n則隻有經過sed處理才顯示 

-e : 直接在指令行模式上進行sed的操作編輯,主要是多點編輯,一行可以處理多個指令

-f : 直接将sed操作寫在一個檔案内,-f filename 則可以執行檔案内sed操作

-r : sed操作支援的是擴充正規表達式文法(預設為基礎正則)

-i: 直接修改讀取的檔案内容,會真正的修改原始文檔

操作說明: [n1[,n2]] function

function參數:

a :新增,a後面可以接字元串,字元串會在目前的下一行出現 

c :替換,c後面可以接字元串,這些字元串可以替換n1,n2之間的行 

d :删除,不需接任何内容 

i :插入,i後面接字元串,字元串在目前的上一行出現 

p :列印,列印某個選擇的資料,通常與sed -n一起運作 

s :搜尋,不但可以搜尋,還可以替換,如:1,20s/old/new/g

sed後面的動作一定是要用‘’包覆

#删除2到5行直接的資料

cat -n /etc/passwd | sed '2,5d'

#删除第2行到最後一行的資料

cat -n /etc/passwd | sed '2,$d'

#在第2行後加一條字元串,(在第二行前用2i)

cat -n /etc/passwd | sed '2a hello word'

sed執行動作的時候,讀取到相應的function後即開始處理,後面若有字元串就當作是要操作的字元串

同時添加多行的時候,每一行資料後面緊跟”\”,單引号要最後使用

#将第2行到第5行替換為“hello world”

cat -n /etc/passwd | sed ‘2,5c hello world’

#将第2行到第5行列印出來

cat -n /etc/passwd | sed -n ‘2,5p’

#将部分資料的查找與替換

格式:sed ‘s/replacestring/newstring/g’

3.awk

awk是一個數字處理工具。相比于sed常常作用于一整行的處理,awk則比較傾向于将一行分為數個“字段”來處理。

awk 'pattern1{action1}pattern2{action2}pattern3{action3}...' filename

兩者是可選的,如果沒有模式,則action應用到全部記錄,如果沒有action,則輸出比對全部記錄。

3.1.模式

模式可以是以下任意一個:

(1)正規表達式:使用通配符的擴充集。

(2)關系表達式:關系運算符進行操作,可以是字元串或數字的比較,如$2>%1選擇第二個字段比第一個字段長的行。

(4)模式比對表達式:用運算符~(比對)和~!(不比對)。

(5)模式,模式:指定一個行的範圍。該文法不能包括BEGIN和END模式。

(6)BEGIN:讓使用者指定在第一條輸入記錄被處理之前所發生的動作,通常可在這裡設定全局變量。

(7)END:讓使用者在最後一條輸入記錄被讀取之後發生的動作。

3.2. 操作

操作由一人或多個指令、函數、表達式組成,之間由換行符或分号隔開,并位于大括号内。

主要有四部份:

(1)變量或數組指派

(2)輸出指令

(3)内置函數

(4)控制流指令

awk内置變量: 

NF : 每一行($0)擁有的字段總數 

NR :目前awk所處理的是“第幾行”資料 

FS : 目前分隔符,預設空格鍵 

在每一行的每個字段都是有變量名稱的,如$1,$2,$3。。

如:

last -n | awk '{ print $1 “\t lines: ” NR “\t columes :” NF}'

在awk中,後續動作都是由單引号包覆的,在print中,非變量的文字部分,必須要使用雙引号來定義。

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

上例中,在調用 awk 時,使用 -F 選項來指定 ":" 作為字段分隔符

4.cut

cut是将一段資訊切割出來,将同一行的資料進行分解,它一

般輸出的是符合條件的字段,并不是一整行的資料,以行為處理機關,輸出主要是以字段為機關,也就是輸出的僅僅是行的一部分資料,主要用于分析log檔案

cut -d '' -f fileds

cut -c 字元範圍

參數:

-d:後面接分隔符,與-f一起使用

-f:根據-d的分隔符将一段消息分為數段,-f表出取出第幾段

-c:以字元為機關取出固定的字段範圍

#輸出分割後的第3和第5段

echo $PATH | cut -d ':' -f 3,5

#将path中第13個字元後的字元串輸出

echo $PATH| cut -c 12-

5.Sort

sort主要是用來進行排序的

格式:sort[-fbMnrtuk] [file or stdin]

-f:忽略大小寫的差異,例如A與a視為編碼相同;

-b:忽略最前面的空格符部分;

-M:以月份的名字來排序,例如JAN,DEC 等等的排序方法;

-n:使用『純數字』進行排序(預設是以文字型态來排序的);

-r:反向排序;

-u:就是uniq,相同的資料中,僅出現一行代表;

-t:分隔符,預設是tab鍵;

-k:以那個區間(field)來進行排序的意思,

cat/etc/passwd | sort -t ':' -k 3

6.Uniq

去掉重複的行,也可以了解為分組的作用。

格式:uniq[-ic]

-i:忽略大小寫字元的不同;

-c:進行計數,主要就是統計相同行的數目

catiplog| uniq 相同的每一個隻輸出一次

catiplog|uniq -c 相同的每一個隻輸出一次,并且在每行首加上出現的次數

uniq去重是去相鄰的行的,是以一般都需要sort

7.WC

WC主要用來對與檔案裡的字數,行數,字元數進行有效的統計

格式:wc[-lwm]

-l:僅僅列出行數

-w:僅僅列出多少字

-m:多少個字元

#列出passwd中的字數等

wcpasswd

2749 1439 passwd

輸出的參數分别為:行數,字數,字元數,檔案名

8split

當檔案太大的時候記得來分割一下

split[-bl] file PREFIX

-b 以大小分割,b,k,m

-l 以行分割

PREFIX 代表分割後的檔案名的字首

#将檔案分成300KB的檔案,

split-b 300k /etc/termcap tersplit

最後分割後的檔案都是tersplitaa, tersplitab,tersplitac

#将多個檔案合并成一個檔案

cattermcap* >>termcapback

>>是累加的資料流重定向模式

9 Comm兩個檔案的比較

如果想對兩個有序的檔案進行比較,使用Comm一般要先Sort以下

文法:comm [- 123 ] file1 file2 

comm指令參數:

  -1   不顯示隻在第1個檔案裡出現過的列。

  -2   不顯示隻在第2個檔案裡出現過的列。

  -3   不顯示隻在第1和第2個檔案裡出現過的列。

  --help   線上幫助。

  --version   顯示版本資訊。

comm - 12就隻顯示在兩個檔案中都存在的行;

comm - 23隻顯示在第一個檔案中出現而未在第二個檔案中出現的行;

本文轉自 zhao_xiao_long 51CTO部落格,原文連結:http://blog.51cto.com/computerdragon/1112168

繼續閱讀