關于Shell的一些常用命令
ls -lat 列出當前目錄所有東東的東東
ls -lath 人看的大小
ls -F | grep "/$"只搞目錄
ls -lR 包括子目錄…
ls --ignore filename -lt 忽略某個
which,在PATH變量指定的路徑中,搜索看某個命令是否存在,以及執行的到底是哪一個位置的命令。
whereis, 搜索程序名,而且只搜索二進制文件、man說明文件和源代碼文件。如果省略參數,則返回所有信息。
locate,在系統特定的數據庫中指定文件名查找,譬如CentOS它只在每天某個時間把新增的文件更新到/var/lib/mlocate /mlocate.db這個數據庫,定時見/etc/cron.daily/mlocate.cron,strings可以看到部分內容
還有一些好用的工具如tree,file,type等
-mtime 修改時間
-type 文件類型
-mmin 修改分鐘
-perm 權限
-user 用戶
-group 組
-maxdepth 搜索目錄的層級
…
更多的東西請找你男人,man
find . -maxdepth 1 -type f ! -name "*.txt"
在層級為1的目錄(當前目錄)查找不是.txt的普通文件
find . -maxdepth 1 -type f \( -name "*.txt" ! -name "haha.txt" \)
查找.txt但不包括類似.haha.txt這樣的文件
find . -maxdepth 1 -type f \( -name "*.php" -o -name "*.txt" \)
查找.php或者.txt的文件
-exec會將find匹配到的所有文件一次性接收過來操作,不幸的是,有些系統對能夠傳遞給 exec的命令長度有限制,會出現溢出錯誤,譬如提示"Argument list too long"
getconf ARG_MAX 看看參數的字節限制
那怎么辦?
xargs xargs命令每次只獲取一部分文件而不是全部,不像 -exec選項那樣。這樣它可以先處理 最先獲取的一部分文件,然后是下一批,并如此繼續下去。
find . -name "*.txt" | xargs -n 200 ls -lat
find . -name "*.txt" | xargs -I file -n 1 mv file file.log 更好理解的表達
find查找避開某個目錄
find . -path "./subdir*" -prune -o -type f -name "*.txt" -print
查找/update/目錄下但不包括子目錄./subdir下面的東西
上面是啥意思? 個人理解:
別被-path迷惑,其實-path就是-wholename,在這里用-wholename "./subdir*" 一樣的。
-depth與-prune沖突,有-depth的話-prune失效
可以用偽代碼表示:
find ... 得到好長好長一串。。。
在這好長一串里
if (-path "./subdir*")
then
-prune #切切切
else (找-type f -name "*.txt")
-print
避開多個目錄
find . -path './subdir' -prune -o -path './subdir1' -prune -o -path './subdir2' -prune -o -path './subdir3' -prune -o -name "*.txt" -print
簡寫成下面的:
find . \( -path './subdir' -o -path './subdir1' -o -path './subdir2' -o -path './subdir3' \) -prune -o -name "*.txt" -print
grep -n a *.txt
顯示匹配行及行號
grep -c a *.txt
只輸出匹配行的計數
grep -v a *.txt
不包含匹配
grep '\<abcd\>' *.txt
精確匹配a
grep '[A-Z][a-z][0-9]' *.txt
打印類似"Ab1"的內容,支持posix正則
grep '[a-z]\{4,\}log' *.txt
打印小寫字母重復四次以上的行,如aaaa,aabbc等
grep -v '^$|^#' *.txt
過濾空行與#開頭的行(通常是注釋)
grep –A5 –B5 'haha' *.txt
打印匹配到'haha'的行以及上5行、下5行
grep '192.168.100.34:3306|pfantasy' –R /usr/local/wwwroot/
也可以寫成egrep -e '192.168.100.34:3306' -e 'pfantasy' -R /usr/local/wwwroot/
grep '192.168.100.34:3306.*pfantasy' -R /usr/local/wwwroot/
awk語句都由模式和動作組成
模式部分決定找對象的時機,一般由條件語句或者正則組成,包括兩個特殊字段:BEGIN{}和END{}
動作就是在某些情況下該干些啥。。。
BEGIN{} 在任何文本瀏覽動作之前,一般用作制表,END{} 用來在完成文本瀏覽后,通常用作統計
因此一般的結構是:awk 'BEGIN{預定義點啥}{正式干點啥}{又干點啥}...END{干完了總結匯報點啥}'
$1 $2 $3 ...
$0代表全部,動作缺省情況下打印全部
通常域的分隔符是空格或者\t
awk 'BEGIN{print "Hello---------\n"}{print $1,$2}END{print "ByeBye----------\n"}' a.txt
動作部分可能要點條件或者循環啥的
awk '{if (xx) print $0}'a.txt
awk '{for (oo) print $0}'a.txt
關于匹配
先來一發 ~
awk '{if ($2 ~ /D/ && $3 ~ /[Hh]aoren/) print $0}' a.txt
再來一發 ==
awk '{if ($2 ~ /D/ && $3 == "Haoren") print $0}' a.txt
其實以上兩個可以寫成,因為動作是默認print的
awk '$2 ~ /D/ && $3 ~ /[Hh]aoren/' a.txt
awk '$2 ~ /D/ && $3 == "Haoren"' a.txt
awk 'BEGIN{IGNORECASE = 1;}{if ($2 ~ /D/ && $3 ~ /[Hh]aoren/) print $0}' a.txt 忽略大小寫
sed跟awk一樣,也是流編輯器
sed有兩個空間
pattern space 模式空間,sed在沒有-n(suppress automatic printing of pattern space)參數時都默認打印模式空間。一般每一行記錄都只路過模式空間一次。
hold space 暫存空間,中轉地方,譬如把模式空間的東東往暫存空間存一下,然后模式空間注入新的東西,一會再去暫存空間取出來。
sed常用的內部操作
n 讀取下一行替換當前模式空間的行。
N 讀入下一行,追加到模式空間行后面,此時模式空間有兩行但只是一坨東西。
h 把模式空間里的行拷貝到暫存空間。
H 把模式空間里的行追加到暫存空間。
g 用暫存空間的內容替換模式空間的行。
G 把暫存空間的內容追加到模式空間的行后。
X 將暫存空間的內容與模式空間里的內容互換。
! 對所選行以外的所有行應用命令。
p 打印當前模式空間的內容。
d 刪除模式空間,開始下一個從頭開始的操作。
D 刪除第一個在模式空間里的換行符前段內容,開始下一個從頭開始的操作。
$ 匹配最后一行
一些練習
每一行后加一個空行
用一個保持為NULL(里面包括了\n)的東東來追加到模式空間后面
sed 'G' a.txt
在匹配行前加入一個空行
由于在行前加,實際上是先打印NULL再打印行內容,因此需要x交換一個NULL過來。匹配行之后,把模式空間的東西扔到暫存空間(x),于是模式空間當前為NULL,把它打印,然后換回來,模式空間為之前的內容,自動打印模式空間。
sed '/aaa b/{x;p;x;}' a.txt
打印奇數行
有跳行的操作,要跟n/N有關了,不打印就是刪除就d吧
sed '{n;d}' d.txt
sed -n '{p;n}' d.txt
sed '0~2d' d.txt
打印偶數行
sed -n '{n;p}' d.txt
sed '1~2d' d.txt
偶數行后加一個空行
sed '{n;G}' d.txt
偶數行置空
sed '{n;g}' d.txt
screen
crontab
expect
…