天天看點

grep、 sed、 find 、xargs、 gawk 輸入輸出整理

正規表達式

\< \>分别表示單詞的開始和結束

ex: \<[Tt]om\> 以T或者t開頭,om結尾的單詞

正規表達式的元字元集:

1) ^行首 /^love/ 以love開頭的行;

2) $行尾 /love$/ 以love結尾的行;

3) . /l..e/ 比對所有這樣的行,字母l後面緊跟任意兩個字元然後是e的行

4) * 重複0次或者任意多次前面字元

5) [x-y] 字元範圍

6) [^x-y] 排除字元範圍

7) \ 轉義字元

8) \< \> 界定單詞的開頭和結尾

9) \( \) 标記後面用到的比對字元 \(love\)able \1er=loveable lover

10) x\{m,n\} 重複字元x至少m此,至多n次

---------------------------------------------------------------------------

grep家族

RE--regular expr

ession; g: global; p: print

除了上面10種元字元集,grep還支援下面的RE

\w 字母或者數字

\W 非單詞字元(标點符号)

+ 重複一個或者多個前面的字元

| 或 love(a:b)表示lovea或者lobeb

?單個字元

grep傳回狀态值($?) 0表示成功,1表示失敗,2表示沒有找到檔案

rgrep遞歸通路目錄樹   A

ls -l |grep ^d 顯示目錄

grep -n -v -# -A# -B#

-i 不區分大小寫

-n 顯示比對行和行号

-v隻顯示不比對行

-#顯示比對行上下#行

-A#比對行後面列印#行

-B#比對行前面列印#行

-c 隻輸出比對行的行數

-h 查詢多檔案的時候不顯示比對的檔案名字

-l 查詢多檔案隻顯示比對的檔案名

-s 不顯示錯誤資訊

grep與正規表達式同用

grep "^[^abc]" *.f 提取行首不是abc的行  "^[    ]"

grep "[0-9]\{3\}[8]" *.f 提取類似xxx8的行,x表示任意數字  ?\{3\}

grep "a\{2\}" *.f 顯示a至少出現兩次的行,注意grep是以行處理機關的

grep -n "^$" file 列出空行的行号              "^$"

-E參數,可以使用"與"和"或"模式

grep -E "abc | def" *.f 顯示包含abc或者def的行  "abc | def"

ex:

ls -l | grep "^$" 顯示目錄  ?

ls -l | grep "^d" 顯示檔案 no d

ls -l | grep "^d..x..x..x" 顯示特定權限的目錄  ??

ps aux | grep "httpd" |grep -v "grep"

**使用find和xargs

1. find pathname -options [-print -exec -ok]

-optinos

1)-name:按照檔案名查找

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

find ~ -name "[a-z][0-9].txt" -print     非大寫?

2)-perm:按照權限查找檔案

find ~ -perm 755 -print 查找權限為755的檔案

find ~ -perm 007 -print 查找o位置上具有7權限的檔案   ??

find ~ -perm 4000 -print 查找具有suid的檔案

3)-prune

不在目前目錄下查找  ?

4)-user和-nouser

find ~ -user zhao -print 查找檔案屬主是zhao的檔案

find ~ -nouser -print 查找檔案屬主已經被删除的檔案

5)-group和-nogroup

find ~ -group zhao -print 查找檔案群組是zhao的檔案

6)按照時間

find ~ -mtime -5 -print 檔案更改時間在5天内的檔案 -5

find ~ -mtime +3 -print 檔案更改時間在3天前的檔案 +3

find ~ -newer file1 -print 查找比檔案file1新的檔案  -newer file1

7)按照類型查找

find ~ -type d -print 查找所有目錄  -type d

8)按照大小

find ~ -size +1000000C -print 查找檔案大小大于1000000位元組(1M)的檔案

9)查找位于本檔案系統裡面的檔案

find / -name "*.txt" -mount -print

-exec,-ok:find指令對于比對檔案執行該參數所給出shell指令,相應指令形式為: 'command' {} \;

-ok 在執行指令前要确認

find ~ -type f -exec ls -l {} \;     ?

find / -name "*.log" -mtime +5 -ok rm {} \; 5天前,-ok 在執行指令前要确認

find . -name core -exec rm {} \;   shell指令 'command' {} \;

使用-x dev參數

防止find搜尋其他分區

find . -size 0 -exec rm {} \;   -exec rm {} \;

删除尺寸為0的檔案

2. xargs與-exec功能類似

find ~ -type f | xargs ls -l

find / -name "*.log" -type f -print| xargs grep -i DB0

find . -type f |xargs grep -i "Mary"  

在所有檔案中檢索字元串Mary  無論大小寫

ls *~ |xargs rm -rf   管道執行

删除所有以~結尾的檔案

SED:

=====

sed [options] sedcommand inputfile >outputfile

sed不接觸初始輸入檔案,對其不做修改,若想儲存改動,重要将輸出重定向到一個檔案即可

a\: 目前行後面加入一行或者文本

c\: 用信文本替換本行的文本

d: 删除一行

D: 删除模闆塊的第一行

i\: 在目前行上面插入文本

h: 拷貝模闆塊的内容到記憶體緩沖區

H: 追加模闆塊的内容到記憶體緩沖區

g: 獲得記憶體緩沖區内容,并替換目前模闆中的文本

G: 獲得記憶體緩沖區内容,并追加到目前模版塊文本的後面

n: 讀取下一個輸入行,用下一個指令處理新行而不是第一個指令

N: 追加下一個輸入行到模版塊後面,并在二者間插入一個新行,改變目前行的号碼

p: 列印模闆塊的行

P: 列印模闆塊的地一行

q: 退出sed

r file: 從file中讀行

!: 表示後面的指令對所有沒有選中的行起作用

s/re/strint/: 用string替換正規表達式re

=: 列印目前行号

#command: 把注釋擴充到下一個換行符号前

l 列印比對行,包括顯示控制符号

**替換标記

g: 行内全部替換

p: 列印行

w: 把行寫入一個檔案

x: 互換模闆塊和緩沖區中的文本

y: 把一個字元翻譯成另外一個字元

**sed中元字元可以使用正規表達式中所有的

新加:

& 儲存搜尋字元 s/love/**&**/ 用**love**代替love

**sed定位文本的方式

x 行号

x-y 從x行到y行

/patern/ 查詢包括patern的行

x,y! 不包括指定x-y行号的行

sed '/Tom/d' file

删除包含Tom的行;d: 删除一行

sed '/Tom/!d' file

删除所有不包含Tom的行;

sed -n /north/p' file

列印包含north的行;p: 列印模闆塊的行

sed ‘3d' file

删除第三行;

sed '3,$d' file

删除第三行到最後一行; 3,$d

sed -n 's/west/north/g' file

替換所有west為north;

s替換,g: 獲得記憶體緩沖區内容,并替換目前模闆中的文本  ?

sed -n 's/^west/north/p' file

一行的開頭的west用north替換,并列印發生替換的行;

sed 's/[0-9][0-9]$/&.5/' file

所有以兩個數字結尾的行,最後兩個數字被他們自己替換并附加.5;& 儲存搜尋字元??

sed -n 's/\(Mar\)got/\1ianne/p' file

将Margot替換為Marianne,并列印發生替換的行;複雜

\( \) 标記後面用到的比對字元 \(love\)able \1er=loveable lover

sed 's#abc#ABC#g' file

所有abc由ABC替換,(所有s後面緊跟的字元都被認為是新的分隔符);

sed '/west/,/east/p' file

列印包含west行和包含east行中間的所有行;?

sed '1,/east/s/$/**A**/' file

地一行和包含east行之間的所有行的行尾加上字元串**A**;

sed -e '1,3d' -e 's/aa/bb/' file

先删除1到3行,然後用bb替換aa;  -e?

sed '/Sam/r file1' file

将檔案file1中的内容附加在包含Sam的行後面;r file: 從file中讀行

sed '/Sam/w file1' file

将還有Sam行寫入檔案file1中;

sed '/^north /a\new line second line' file

所有以north加空格開頭的行後面附加上兩行文本,a\表示追加文本,\表示換行(tcsh中需要,bash中不需要);

sed '/^north/i\new line' file

在行首為north的行前面插入一個新行;i\: 在目前行上面插入文本

sed '/norht/{n; s/aa/bb/;}' file

首先比對含有north的行,然後執行一組指令,n表示移到下一行,并用bb代替aa;

sed '1,3g/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file

将1到3行中的所有小寫字母用大寫字母替換;

sed '/Lewis/{s/Lewis/bbb;q;}' file

首先找到比對Lewis的行,然後用bbb代替Lewis,接着q退出seq;?

sed -e '/north/h' -e '$G' file

首先找到包含norht的行,h拷貝到記憶體緩沖區,然後到檔案随後一行($),G附加在最後一行後面;

sed -e '/we/{h;d;}' -e '/ct/{G:}' file

查找包含we的行,拷貝并且删除他,然後查找包含ct的行,将拷貝内容附加到他後面;  G: 獲得記憶體緩沖區内容,并追加到目前模版塊文本的後面

sed -e '/north/h' -e '$g' file

首先找到包含norht的行,h拷貝到記憶體緩沖區,然後到檔案随後一行并覆寫他;

sed -n 'l' file

列印所有包含不能列印字元的行。l  ??

sed -n '/.*ing/p' file

顯示含有以ing結尾單詞的行; /.*ing/p

sed -n '/music/=' file

列印含有music的行号;

sed '^$d' file

删除空行

sed 's/^/abcd/g' file  g?

在行首填加abcd

sed 's/$/abcd/g' file

在行尾填加abcd

sed 's/rm$/played &/g' file

&表示在替換的時候保留被替換的詞(rm--played rm)=>s/rm$/played &/

sed 's/^M//g' file

去掉行尾的^M (^M的輸入,先按ctrl+v然後按enter即可即可)

gawk程式:

awk [-F 域分隔符] 'commands' inputfile

awk執行時,其域标志符為$1,$2,$3.........$n,$0表示所有的域

awk -v var=value 指派給一個使用者定義的變量

awk 'pattern' file

awk '{action}' file

awk 'pattern {action}' file

ex:

awk '{print $0}' file

列印所有的域

awk '/Mary/' file

列印包含file中包含Mary的行;

/Mary/ 查詢包括Mary的行 ' '

awk '{print $1}' file

列印檔案的第一列(第一個域);ok

awk '/Mary/ {print $1,$2}' file

列印檔案file包含Mary的行的第一和第二個域;'/ / { }'

df | awk 'S4>75000'

列印可用空間大于75000的檔案系統

第4項 為大小   ' '

date | awk '{print " month:", $2, "\n year:" $6}'

格式化date的輸出;

2列 6列 ,month  year: 原樣打出  " "              \n ?print

awk 'BEGIN{OFMT="%.2f"; print 1.25463}'

指定數字輸出格式,小數點後面保留兩位有效數(1.25);

不懂 ??

awk '/[ab]cdef/' file

列印比對acdef或者bcdef的行;

/[ ]     / 任意singo

awk '{print NR, $0}' file

awk '{print $0, NR}' file

NR目前記錄數,每處理一個記錄NR就加1

上面的指令相當于在每一行後面加上一個行号;?

NF則記錄每一行的域的個數;

awk -F '[ :\t]' '{print $0}' file

指定域分隔符為空格、:或者tab

awk '/^[A-Z][a-z]+/' file

列印所有以一個大寫字母開頭,然後是一個或者多個小寫字母的行;

^行首

awk '$1~/[Bb]ill/' file

第一個域比對Bill或者bill的行;

~//表示比對正規表達式

awk '$1!~/ly$/' file

第一個域末尾不是ly的行; !~//表示不比對正規表達式           $行尾/ly$/以ly結尾的行

awk '/^(No|no)/' file

列印行首為No或者no的行;     ^(No|no)  

awk 'BEGIN {print "file head \n"} {print $1 \t $4}' file

awk 'BEGIN {print "file head \n"} {print $1 \t $4}' file |tee out.file

列印檔案的時候附加一個檔案頭

awk 'BEGIN {print "file head \n"} {print $1 \t $4} END {print "end of file"}' file

列印檔案的時候附加一個檔案頭和檔案尾

awk中使用正規表達式

awk '{if($1~/hello/) print $0}' file

如果域1中包含hello,就列印所有的域    

~//表示比對正規表達式,!~//表示不比對正規表達式

awk '{if($6<$7) print $0}' file

awk '{if($1=="abc") ($1="def") print $0}' file

awk '{if($1=="abc") {($1="def") print $0}}' file 隻列印修改的部分 {    }

awk表達式:

<,<=,>,>=,==,!=,~,!~(比對,不比對)

awk ‘$3==5346' file

第三個域等于5346,就列印出該行;

awk '$3>5000 {print $1}' file

第三個域大于5000就列印該行第一個域

awk '{max={$1>$2}?$1:$2; print max}' file

如果第一個域大于第二個域,max=$1否則=$2,列印最大值 A

awk '{print ($1==11?"high\t" $2:"low\t" $2)}' file

&&邏輯和,||邏輯或,!邏輯非

awk '$2==$5 && $3>5' file

awk '/Tom/,/Jary/' file

Tom第一次出現和Jary第一次出現之間的所有行;

awk '/north/ {print $3+10}' file

包含north行的地三個域加10;

awk '$3=="aa" {$2="dd"; print $0}' file

将地三個域為aa的行的第二域變成dd,并列印該行;

**awk程式設計:

使用變量

awk '$1~/Tom/ {wage=$2+$3; print wage}' file   ~//表示比對正規表達式

先掃描第一個域,如果比對Tom,就将第二和第三域的總和指派給變量wage并輸出;

awk 'BEGIN{FS=":"; OFS="\t";ORS="\n\n"}{print $0}' file

處理檔案前設定  ??

域分隔符(FS)為(:)

輸出域分隔(OFS)為(\t)

輸出記錄分隔符(ORS)為(\n\n)

awk 'END{print "The number of record is:' NR}' file

處理完檔案後執行END語句

輸出總記錄數

awk '/Mary/{count++} END{print "Mary was found" count "times"}' file

計數檔案中Mary出現的次數;

**awk輸入輸出重定向

awk '$4>=70 {print $1, $2 >"outfile"}' file

結果重定向到檔案outfile中

awk 'BEGIN{"date" |getline d; print d}'

将date結果輸給getline函數,并列印      BEGIN{      }

(getline從标準輸出,管道等獲得輸入)

awk 'BEGIN{"date" |getline d; split(d,mon); print mon[1] mon[2]}'

将date結果輸給getline函數,slpit将d分解成數組,列印數組第2個變量

**split函數:split(string,array,field seperator)

awk 'BEGIN{while("ls"|getline) print}'

依次輸出ls的每一項  ?

awk 'BEGIN{print "what is your name?"; getline name <"/dev/tty"} $1~name {print "Found" name "on line" NR "."} END{print "see you" name}' file

從标準輸入裝置輸入姓名,然後在檔案file的第一個域内比對,并做相應輸出 ??

awk 'BEGIN{while(getline <"/etc/passwd" >0) {lc++; print lc " " a}}'

awk 'BEGIN{while(getline a <"/etc/passwd" >0) {lc++; print lc}}'

如果檔案不存在,getline傳回-1

到達檔案尾傳回0

讀到一行傳回1

讀取檔案/etc/passwd,計數行數

**awk控制語句

if語句:

awk '{if($6>50) print $1 "too high"}' file

awk '{if($6>20 && $2<=50) {safe++; print safe}}' file

awk '{if($5>50}{x++; print x} else {y++;print y}' file

awk '{if($1~/peter/){next} else {print}}' file

如果第一個域包含peter,awk就忽略這一行,讀取檔案的下一行,腳本從頭開始執行;

循環語句:

awk '{i=1; while(i<=NF) {print NF, $NF; i++}}' file

awk '{for(i=1;i<=NF;i++) print NF, $NF}' file

循環中可以使用break和continue終止或者回到循環開始處繼續循環;

**awk數組:

awk 'BEGIN{x=1} {name[x++]=$2}; END{for(i=1;i<=NR;i++) print i,name[i]}' file

将檔案file第二個域讀入數組name中,并依次輸出他們

awk '{id[NR]=$1}; END{for(i=1;i<=NR;i++) print i,id[i]}' file

awk '/^Tom/ {name[NR]=$2}; END{for (i in name) print i, name[i]}' file

讀取行首為Tom的行的第二個域到數組name,最後輸出name

數組下标可以使用字元串

/Tom/{count["Tom"]++}

/Mary/{count["Mary"]++}

awk '{count[$2]++}; END{for (name in count) print name, count[name]}' file

***awk的指令行參數

ARGC參數個數

ARGV參數清單(數組下标從0開始)

使用指令行參數的例子:

test.awk

BEGIN{FS=":"; name=ARGV[2]}

$1~name{print $0}

awk -f test.awk file "Tom"

***awk内建函數:

*sub,gsub: 替換函數

awk '{sub(/Mac/,"MacIntosh"); print}' file

用MacIntosh替換Mac

awk '{sub(/Mac/,"MacIntosh",$1); print}' file

第一個域内用MacIntosh替換Mac

*index子串位置

awk '{print index("hello","lo")}' file

字串長度

awk '{print length("hello")}' file

取子串:

awk '{print substr("hello",3,2)}' file

從地三個字元開始取子串,長度為2

改變大小寫

awk 'BEGIN{print toupper("hello"), tolower("HELLO")}' file

***自定義函數

function funname(parameter,.....){

函數體

**輸入與輸出

1.

echo

\c 不換行

\n 換行

-e 當echo後面文字包括轉義字元的時候要使用-e   ?

echo ''name? \c"

echo -e "\007 your home is $HOME, you are connect on `tty`"

2.

cat

cat file1 file2 file3 > file

cat -v file 顯示檔案,包括其中的控制符(-v)

cat -n file 為每一行編号

cat -b file 每個非空行編号

cat -T file 以^I顯示tab

3.

管道 | 把一個指令的輸出傳遞給另外一個指令為輸入

ls | grep file.doc

查找檔案file.doc

who | awk '{print $1 "\t" $2}' 隻顯示使用者名和所在終端

df -h | awk '{print $1}' |grep -v "filesystem" (-v表示輸出不包括filesystem的項目)

df -h | awk '{print $1}' |grep -v "filesystem" |sed 's/\/dev\///g' 顯示裝置的時候不顯示/dev/

4.tee

who | tee who.txt 輸出到螢幕的同時輸出到檔案

who | tee -a who.txt 附加在檔案的後面

5.檔案重定向

ls -l |grep ^d >file.out 所有目錄名字重定向到一個檔案

cat /etc/passwd | awk -F: '{print $1}' |sort >a.out (-F:指定分隔符為:) ?

cat >file.out << EOF 在輸入内容的時候,當EOF單獨出現在一行的時候表示檔案輸入到此結束

chmod [u g o a] [+ - =] [r w x s l] file

s:給檔案屬主群組set-ID

l:給檔案加鎖,使得其他的使用者不能通路

*suid和guid

suid意味着如果某個使用者對屬于自己的shell腳本設定了這種權限,則其他使用者在執行這個腳本時也具有其屬主的相應權限。

設定suid,4xxx,設定guid,2xxx,兩者同時設定,6xxx

要設定檔案的suid和guid必須同時具有相應的執行權限,否則在相應的位置會出現S辨別而不是s。

chown -R -h ower:group file

-h:表示隻改變符号連結的屬主不影響其所指向的目标檔案

**自動ftp傳輸

lftp < file

$ cat file

open -u zhao,pass hostip

binary

cd dir

mget *

tcsh:

set prompt='[%n@%m %c]$' 使用者名@主機名 目前目錄名

bash:

export PS1="[\n@\h \w]$"

man -k keyword

在man資料中查找關鍵詞

at now +3 hours

at> reboot

at> ctrl+D

3小時後reboot

bc - 電腦

scale=3 設定小數點後數字為數

ibase=2 二進制運算

4.

ls -d dir

隻顯示目錄而不顯示其下面的檔案。

5.

sync

更新superblock并把它寫入硬碟

6.

scp user@host:/path/file1 user@host:/path/file

伺服器間拷貝檔案

      本文轉自crazy_charles 51CTO部落格,原文連結:http://blog.51cto.com/douya/1282943,如需轉載請自行聯系原作者