歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

linux按內容查找文件

1,在某個路徑下查文件。 在/etc下查找“*.log”的文件 find /etc -name "*.log"2,擴展,列出某個路徑下所有文件,包括子目錄。 find /etc -name "*"3,在某個路徑下查找所有包含“hello abcserver”字符串的文件。 find /etc -name "*" | xargs grep "hello abcserver" 或者find /etc -name "*" | xargs grep "hello abcserver" > ./cqtest.txt4,網上摘抄的幾個和查找文件或文件內容相關的命令詳說:正則表達式

\分別表示單詞的開始和結束

ex: \ 以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 expression; g: global; p: print

出了上面10種元字符集,grep還支持下面的RE

\w 字母或者數字

\W 非單詞字符(標點符號)

+ 重復一個或者多個前面的字符

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

?單個字符

grep返回狀態值($?) 0表示成功,1表示失敗,2表示沒有找到文件

rgrep遞歸訪問目錄樹

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

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表示任意數字

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

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

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

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

ex:

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

ls -l | grep "^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

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天內的文件

find ~ -mtime +3 -print 文件更改時間在3天前的文件

find ~ -newer file1 -print 查找比文件file1新的文件

7)按照類型查找

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

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 {} \;

find . -name core -exec rm {} \;

使用-x dev參數

防止find搜索其他分區

find . -size 0 -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行號的行

ex:

sed '/Tom/d' file

刪除包含Tom的行;

sed '/Tom/!d' file

刪除所有不包含Tom的行;

sed -n /north/p' file

打印包含north的行;

sed ‘3d' file

刪除第三行;

sed '3,$d' file

刪除第三行到最後一行;

sed '$d' file

刪除最後一行;

sed '/north/d' file

刪除包含north的行;

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

替換所有west為north;

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,並打印發生替換的行;

sed 's#abc#ABC#g' file

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

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

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

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

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

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

先刪除1到3行,然後用bb替換aa;

sed '/Sam/r file1' file

將文件file1中的內容附加在包含Sam的行後面;

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的行前面插入一個新行;

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的行,將拷貝內容附加到他後面;

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

首先找到包含norht的行,h拷貝到內存緩沖區,然後到文件隨後一行並覆蓋他;

sed -n 'l' file

打印所有包含不能打印字符的行。

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

顯示含有以ing結尾單詞的行;

sed -n '/music/=' file

打印含有music的行號;

sed '^$d' file

刪除空行

sed 's/^/abcd/g' file

在行首填加abcd

sed 's/$/abcd/g' file

在行尾填加abcd

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

&表示在替換的時候保留被替換的詞(rm--played rm)

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的行;

awk '{print $1}' file

打印文件的第一列(第一個域);

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

打印文件file包含Mary的行的第一和第二個域;

df | awk 'S4>75000'

打印可用空間大於75000的文件系統

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

格式化date的輸出;

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

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

awk '/[ab]cdef/' file

打印匹配acdef或者bcdef的行;

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的行;

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

打印行首為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,>=,==,!=,~,!~(匹配,不匹配)

awk ‘$3==5346' file

第三個域等於5346,就打印出該行;

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

第三個域大於5000就打印該行第一個域

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

如果第一個域大於第二個域,max=$1否則=$2,打印最大值

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函數,並打印

(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 0) {lc++; print lc " " a}}'

awk 'BEGIN{while(getline a 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 && $250}{x++; print x} else {y++;print y}' file

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

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

循環語句:

awk '{i=1; while(i file

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

cat -n file 為每一行編號

cat -b file 每個非空行編號

cat -T file 以^I顯示tab

Copyright © Linux教程網 All Rights Reserved