1. 程式人生 > >【linux之find及awk】

【linux之find及awk】

user con linux art mtime follow proc lock 樣式

一、find命令

find

精確查找,根據提供的條件或組合條件進行查找,遍歷所有文件,因此速度比較慢。

語法:

find 目錄 條件 動作

默認目錄是當前目錄
默認條件是所有條件
默認動作是顯示查找到的信息

條件(選項):

   -name FILENAME:精確匹配,根據文件名進行查找,文件名支持通配符
   -user USENAME:根據文件的屬主查找文件
   -group GROUPNAME:根據文件的屬組查找文件
   -nouser:查找沒有對應屬主用戶的文件
   -nogroup:查找沒有對應屬組的文件
   -a:與
   -o:或
   -not:非
   find / -not \( -name passwd
-a -user root \) -inum n:查看inode號為n的所有文件名 時間單位為天 -atime +|-n 訪問時間 -ctime +|-n 改變時間 -mtime +|-n 修改時間 時間單位為分鐘 -amin +|-n -cmin +|-n -mmin +|-n +10:10天前 -10:10天內 -mtime +60:60天前修改過 -mtime -60:60天內修改過 -mtime 60:60前同一時間修改 -type c File is of type c: b block (buffered) special c character (unbuffered) special d directory p named pipe (FIFO) f regular
file l symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken. If you want to search for symbolic links when -L is in effect, use -xtype. s socket
-maxdepth 2:查找兩級子目錄(放最前面) -perm(權限)-mode(與):查找所有的權限都必須滿足mode條件的文件 /mode(或):查找至少一個權限位滿足mode條件的文件 find /tmp -perm -222 (三個條件必須同時具備) find /tmp -perm /222(其中一個條件具備即可)

動作:

   -print:顯示
   -exec:執行相應的命令,在執行命令之前向用戶不詢問
      {}:通過find命令查找到的文件名
   -exec COMMAND {} \;
   -ok:執行相應的命令。在執行之前向用戶發出詢問
   -ls:在執行查找之後以ls -l命令顯示查找到的文件

find練習

  1)查找/var目錄下屬主為root,屬組為mail的所有文件;
  find /var -user root -a -group mail
  2)查找/usr目錄下不屬於root、bin、qhdlink等用戶的文件;
  useradd qhdlink
  find /usr -not \( -user root -a -user bin -a -user qhdlink \)
  3)查找/etc目錄下最近一周內內容修改過且不屬於root及student用戶的文件;
  find /etc -mtime -7 -a -not -user root -a -not -user student
  4)查找當前系統上沒有屬主或屬組且最近1天內曾被訪問過的文件,並將其屬主屬組均修改為root;
  find / -nouser -o -nogroup -a -atime -1 -exec chown root: {} \;
  5)查找/etc目錄下所有用戶都沒有寫權限的文件,顯示出其詳細信息;
  find /etc -not -perm /222 -ls

二、awk

awk是一種可以處理數據、產生格式化報表的語言,功能相當強大。awk的工作方式是讀取數據文件,將每一行數據視為一條記錄(record),每筆記錄以字段分隔符分成若幹字段,然後輸出各個字段的值。

以下是執行ps auxw的輸出片段:

USER PID %CPU %MEM VSZ RSS TTY
STAT START TIME COMMAND
root 1 0.0 0.0 164 92 ?
Ss Apr09 0:01 init [5]

像這種固定結構的數據,用awk來處理,特別有威力,通常只要短短幾行程序代碼就可以完成工作。

例如,僅用以下單一指令,就可取得所有行程的PID:

ps auxw | awk ‘{print $2}‘
那麽,awk是如何處理每一筆記錄的呢?

awk對每一條記錄,都會套用一個"樣式{操作}",如果該行符合樣式,就執行指定的操作。樣式或操作之一,可以省略。如果只有樣式,表示要顯示符合樣式的數據行;如果只有操作,表示對每一數據行都執行該項操作。

語法:

awk"樣式"文件:把符合樣式的數據行顯示出來。

awk {操作} 文件:對每一行都執行{}中的操作。

awk 樣式{操作} 文件:對符合樣式的數據行,執行{}中的操作。

用法

awk的用法1:

awk /La/ dataf3 
顯示含La的數據行。

awk的用法2:

awk { print $1, $2 } dataf3 
顯示dataf3每一行的第1和第2個字段。

$1代表第1個字段,$2代表第二字段,其他類推。

awk的用法3:

awk /La/{ print $1, $2 } dataf3 
將含有La關鍵詞的數據行的第1及第2個字段顯示出來。

awk的用法4:

awk -F: /^ols3/{ print $3, $4 } /etc/passwd 
使用選項-F,指定:為分隔字符,賬號ols3的uid(第3字段)及gid(第4字段)顯示出來。

awk的用法5:

awk -F: BEGIN{OFS="+++"}/^ols3/{ print $1,
$2, $3, $4, $5 } /etc/passwd 
以:為分隔字符,+++為輸出字段分隔符,將賬號ols3的第1~5欄顯示出來。

}執行結果:

ols3+++x+++1002+++1002+++ 
本例中,BEGIN{}區域指示awk一開始先做初始化的操作,即設定OFS="+++"。變量OFS的作用是存儲輸出字段的分隔符。接著,尋找ols3的賬號行,找到後,使用print印出第1 ~ 第5個字段,且彼此用 +++ 隔開。

實例

取得網卡的IP:

ifconfig | grep inet addr: | grep Bcast |
awk {print $2} | awk -F: {print $2} 
取得網絡設備名稱:

cat /proc/net/dev | awk -F: /eth.:|ppp.:|wlan.:/{print $1} 
在本例中,-F:把分隔字符設為:,而且,采用多選一的樣式 /eth.:|ppp.:|wlan.:/。這個樣式的意思是:設備名稱可以是eth0:、ppp1:、wlan1: 這3個其中之一。一旦找到符合樣式的字符串後,去掉:,取其中的第一個域值,因此,可能的答案是eth0或ppp1或wlan1。

取得系統內存大小:

cat /proc/meminfo | awk /MemTotal/{print $2} 
/proc/meminfo記載主機內存相關數據,其中MemTotal為內存大小,其樣本值如下:

MemTotal:       223128 kB

因此,在awk的樣式語法中,利用/MemTotal/ 找到這一行,再印出第二個字段,即可得到內存的大小。

修改CSV文件各字段的順序:

以下是數據文件dataf6.csv,想要把第2個字段和第4字段調換:

所在鄉鎮,學校名稱,學校網址,校長姓名,學校電話,VOIP前三碼,學校地址

新營市,南新國中,http://www.ns12jh.tnc.edu.tw,ABC,06-656313012,1021,新營市民治路6675號

佳裏鎮,佳裏國中,http://www.jl41jh.tnc.edu.tw,NOP,06-722224432,1146,佳裏鎮安南路5523號

新營市,新營國小,http://www.sy53es.tnc.edu.tw,DEF,06-632213642,1482,新營市中正路3248號

做法如下:

範例  13-3-1:chcsv24.sh

01.     #! /bin/Bash  
02.  
03.     TMPF=/tmp/tmp.$$ 
04.     cat dataf6.csv | awk -F, BEGIN{OFS=","}
{print $1,$4,$3,$2,$5,$6,$7} > $TMPF  
05.     mv -f $TMPF dataf6.csv 

行3,設定臨時文件名。

行4,將數據文件的內容通過管道交給awk處理。awk的字段分隔字符和輸出分隔字符,皆設為,。在{}的操作中,調換$2和$4的順序,再把結果轉向存儲在臨時文件中。

行5,將臨時文件覆蓋原文件。

【linux之find及awk】