1. 程式人生 > >linux-grep-tail-find

linux-grep-tail-find

如果在只是想匹配模式的上下幾行,grep可以實現。

 

$grep -5 'parttern' inputfile //列印匹配行的前後5

 

$grep -C 5 'parttern' inputfile //列印匹配行的前後5

 

$grep -A 5 'parttern' inputfile //列印匹配行的後5

 

$grep -B 5 'parttern' inputfile //列印匹配行的前5

 

檢視mysql慢日誌中ip地址為192.168.0.10傳送過來的SQL語句的後面三行

 

  1. tail -50 /usr/local/mysql/data/sql-slow.log |grep -3 '192.168.0.10'  

匹配php錯誤日誌中某一個欄位

 2tail -100 /data/logs/php/php_error_5.3.log  | grep  "Memcache::get()";

檢視某一個檔案第5行和第10

 sed -n '5,10p' filename 這樣你就可以只檢視檔案的第5行到第10行。

========================================================================================

1tail -f filename
說明:監視filename檔案的尾部內容(預設10行,相當於增加引數 -n 10),重新整理顯示在螢幕上。退出,按下CTRL+C

2tail -n 20 filename
說明:顯示filename最後20行。

3tail -r -n 10 filename
說明:逆序顯示filename最後10

========================================================================================

對日誌記錄做多次grep過濾輸出,格式如下:

tail -f log | grep xxx | grep yyy

發現grep失效,無法做正確輸出。google研究了一下,原因如下:

管道 | 是全緩衝的,一般來說buffer_size4096,有些是8192。不管具體值多少,只有buffer_size滿了,才會看到輸出。

在操作裡  >>file 這個操作也是全緩衝的。調整如下

tail -f log | grep --line-buffer xxx | grep --line-buffer yyy

結果輸出正常。

grep當帶上了 --line-buffer 的時候,每輸出一行,就重新整理一次。

unix裡,塊裝置和普通檔案,以及管道都是全緩衝的。

 

對日誌分析告警和實時監控可以考慮如下形式:

 

tail -f $LOGF | while read var

do

case "$var" in

...

...

esac

done

========================================================================================

 

標準unix/linux下的grep通過下面引數控制上下文

 

grep -C 5 foo file 顯示file檔案裡匹配foo字串那行以及上下5

grep -B 5 foo file 顯示foo及前5

grep -A 5 foo file 顯示foo及後5

 

檢視grep版本號的方法是

grep -V

========================================================================================

 

grep 後面帶上-A -B -C 引數可以多顯示幾行內容

 

grep -A 5 可以顯示匹配內容以及後面的5行內容

grep -B 5 可以顯示匹配內容以及前面的5行內容

grep -C 5 可以顯示匹配內容以及前後面的5行內容

 

$ cat size.txt

b124230

b034325

a081016

m7187998

m7282064

a022021

a061048

m9324822

b103303

a013386

b044525

m8987131

B081016

M45678

B103303

BADc2345

 

$ cat size.txt | grep 'a022021'

a022021

 

$ cat size.txt | grep 'a022021' -C 2

m7187998

m7282064

a022021

a061048

m9324822

 

$ cat size.txt | grep 'a022021' -B 2

m7187998

m7282064

a022021

 

$ cat size.txt | grep 'a022021' -A 2

a022021

a061048

m9324822

========================================================================================

1.目錄操作:

1cd  (切換目錄)

  cd ~   回到主目錄

  cd      回到主目錄

  cd ..   回到上層目錄

  cd -    回到剛才的目錄

  cd /var/spool/mail    絕對路徑

  cd ../mqueue     相對路徑(由/var/spool/mail 轉到/var/spool/mqueue這樣寫)

2pwd (顯示當前目錄)

  pwd   顯示當前目錄

  pwd -P   顯示當前目錄(不以連線檔案的資料顯示,而是顯示正確的完整路徑)

3mkdir (新建一個新目錄)

  mkdir -p test1/test2/test3   建立多層目錄

  mkdir -m 777 test2   新建許可權777的目錄

4rmdir (刪除一個空目錄)

  rmdir test  刪除空資料夾test

  rmdir -p test1/test2/test3  刪除test1/test2/test3

2.檔案與目錄管理

1)檢視檔案目錄(ls

  ls -a  列出全部檔案,包括隱藏檔案

  ls -A  列出全部檔案,包括隱藏檔案,不包括...兩個目錄

  ls -d  僅列出目錄本身,不包括其中檔案資料

  ls -l   列出長串資料,包含檔案屬性與許可權

  ls -R 按檔案容量大小排序

  ls -t  按時間排序

  ls --color=never  不顯示顏色(always顯示顏色,auto自動判斷)

  ls --full-time  以完整時間模式輸出

2)複製、刪除與移動(cp,rm,mv

  cp -a  /var/log/wtmp wtmp_test 將檔案所有特性複製過去

  cp /var/log/wtmp .  複製到當前目錄

  cp -i   若目標檔案存在,則覆蓋時先詢問操作的進行

  cp -p  連同檔案屬性一起復制

  cp -r   目錄的複製

  cp -d  若原始檔作為連線檔案的屬性,則複製連線檔案屬性而非連線檔案本身

  cp -s  複製成為符號連線檔案

  rm -i  互動模式,刪除前詢問使用者是否操作

  rm -f  忽略不存在的檔案,不會出現警告資訊

  rm -r  遞迴刪除

  mv -f  如果目標檔案存在,不會詢問而直接覆蓋

  mv -i  如果目標檔案存在,則詢問是否覆蓋

  mv -u 如果目標檔案存在,且source比較新,則覆蓋

3)取得路徑檔名與目錄名稱

   basename /etc/systemd/network  取得最後的檔名(network
   dirname /etc/systemd/network      取得目錄名(/etc/systemd
3.檔案內容查閱
1)直接檢視檔案內容
  cat 由第一行開始顯示內容

  cat -A  完整顯示,包含特殊字元

  cat -b  列出行號(空白行不標行號)

  cat -n  打印出行號(包括空白行)

  tac 反向顯示,與cat相反

  nl 新增行號列印

  nl -b a  打印出行號(包括空白行),類似cat -n

  nl -b t   如果有空行,空的那行不列出行號

  nl -n ln  行號在螢幕坐方顯示

  nl -n rn  行號在欄位右方顯示,不加0

  nl -n rz  行號在欄位右方顯示,加0

  nl -w 3   行號預設欄位改為3

2)可翻頁檢視

  more /etc/manpath.config 檢視檔案資訊(空格翻頁,enter鍵向下滾動一行,/字串向下查詢,:f立刻顯示檔名及目前顯示行數,b往回翻頁,q離開)

  less /etc/manpath.config 檢視檔案資訊(空格/pageup上翻,pagedown下翻,/字串向下查詢,?字串向上查詢,n重複查詢,N反向重複,q離開) 

3)資料選取

  head -n 10 /etc/manpath.config  顯示前10行(不加-n 10也是預設顯示前10行) 

  head -n -10 /etc/manpath.config  顯示前面所有行數,不包括後10

  tail -n 20 /etc/manpath.config  顯示最後20

  tail -n +20 /etc/manpath.config  顯示後面所有行數,不包括前20

  tail -f  持續檢測行數,直到按下ctrl+c

4)非文字檔案

  od -t a  預設字元輸出

  od -t c  ASCII字元輸出

  od -t d  十進位制輸出(f浮點數,o八進位制,x十六進位制)

  od -t oCc /etc/issue  八進位制列出儲存值與ASCII對照表

5)修改檔案時間或者建立新檔案

  touch test  新建一個新檔案test

  touch -a  修改訪問時間

  touch -c  僅修改檔案時間,若檔案不存在則不建立新檔案

  touch -m 修改mtime

  touch -d "2 days ago" test   test檔案日期調整為兩天前

  touch -t 1503151820 test  test檔案時間調整為2015.3.15 18:20

4.預設許可權與隱藏許可權

  umask 002  預設許可權去除的是其他人許可權的w許可權

  chattr +i test 設定test檔案的隱藏屬性(不能被刪除、改名、寫入新增資料,僅root使用者可設定)

  chattr +a test 設定test檔案的隱藏屬性(只能新增資料,不能刪除、修改,僅root使用者可設定)

  chattr -a test 取消test檔案的隱藏屬性

  lsattr test  顯示test檔案隱藏屬性

  file test  檢視檔案型別

5.命令與檔案的查詢

  which ifconfig 找出ifconfig命令的完整檔名

  whereis ifconfig  尋找ifconfig這個檔案

  locate ifconfig   尋找與ifconfig相關的檔案

  find /etc -mtime 3  3天前的一天之內改過的檔案

  find /etc -mtime -3  3天之內改過的檔案(不包括第3天)

  find /etc -mtime +3  3天之前改過的檔案(不包括第3天)

  find /etc -newer /etc/passwd  尋找/etc下比passwd日期新的檔案並列出

  find / -nouser  尋找系統中不屬於任何人的檔案

  find /home -user root  尋找/home下屬於root的檔案

  find /etc -name test  尋找/etc下名為test的檔案

  find / -size +100k 尋找系統中大於100k的檔案

  find / -size +100k -exec ls -l {} \;  將上面找到的檔案用ls -l列出來