Shell 命令 find grep xargs 學習
find命令
find命令用于在一個目錄(及子目錄)中搜索文件, 可以指定匹配條件, 如文件名, 文件類型
在Mac下有強大的Spotlight和Alfred(感覺window下的everything更牛叉), 所以find用的就比較少了
</div>find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
</div>常用形式為:
# path表示 find 命令查找的目錄路徑
$ find [path] [expression]
# 查找當前路徑下的所有git為前綴的文件, 這里*被稱為通配符
find . -name 'git*'
# 查找當前路徑下所有以.txt和.pdf為后綴的文件
$ find . \( -name "*.txt" - o -name "*.pdf" \) - print
# !表示否則, 查找所有不是以.txt為后綴的文件
$ find . ! -name "*.txt" - print
# 按類型搜索, 只所有目錄( f 表示文件 l 表示符號鏈接(軟鏈接) d 表示目錄)
$ find . - type d - print
# 按用戶搜索 找到所有andrew_liu的用戶文件
$ find . - type f -user andrew_liu - print
# 按照時間搜索 -atime - 30 m 搜索 30 分鐘內被訪問的文件(后面有詳細解釋)
$ find . -atime - 30 m - type f - print
# -atime + 30 m 搜索超過 30 分鐘被訪問的文件
$ find . -atime + 30 m - type f - print
# 找到以.txt為后綴的文件后刪除
$ find . - type f -name "*.txt" - delete
</div>按時間搜索(這些元數據都在inode的結構體中有記錄)
- atime 訪問時間 (單位有一周w, 一天d, 一小時h, 一分鐘m, 一秒s, 以下類似)
- mtime 修改時間 (內容被修改)
- ctime 變化時間 (元數據或權限變化) </ul>
- grep全稱是globally search a regular expression and print, 表示全局正則表達式匹配并輸出, 它的使用權限是所有用戶
- 存在很多grep的修改版, 例如agrep表示近似的grepapproximate grep用于模糊字符串搜索, fgrep用于固定樣式搜索fixed pattern searches, 而egrep用于搜索更復雜的正則表達式語法(摘自wiki) </ul>
- -c:只輸出匹配行的次數
- -l:查詢多文件時只輸出包含匹配字符的文件名
- -n:顯示匹配行及行號
- -v:顯示不匹配行
- -i:搜索時忽略大小寫
- -l:只打印包含匹配行的文件名
- -e:指明一個查找模式(常用多一次匹配多個查找模式)
- -R:遞歸的查找多級目錄 </ul>
- xargs 能夠將輸入數據轉化為特定命令的命令行參數,可以配合很多命令來組合使用
- 經常和find, grep通過管道連接使用 </ul>
- -d定義定界符 (默認為空格 多行的定界符為 n)
- -n指定輸出為多行
- -I{} 指定替換字符串,這個字符串在xargs擴展時會被替換掉,用于- `待執行的命令需要多個參數時
- -0:指定0為輸入定界符 </ul>
grep命令
grep命令是強大的文本搜索命令
</div>使用格式: grep [options] match_patten file
</div>option這里值列舉幾個常用的選項, 其他可以使用man grep進行查看
# 匹配test.doc文件中所有存在hello的行
$ grep 'hello' test.doc
# 匹配test.doc文件中所有存在hello的行, 并打印行號
$ grep -n 'hello' test.doc
# 找到所有行不匹配hel或者how, -e匹配多個模式
$ grep -v -e 'hel' -e 'how' test.doc
# 在多級目錄中對文本遞歸搜索
$ grep "class" . - R -n
#輸出結果:
./test/ class . c :1: class
./test/ class . c :2: class yes
./test/ class . c :4: class fuck
./test. doc: 5 :class
./test. pdf: 1 :class
# 找到所有以.hel開頭的行, 并使用管道命令
$ cat test.doc | grep '^\.hel'
# 找到所有包含hel行的行數(只輸出行數, 沒有內容)
cat test.doc | grep -c 'hel'
# 更多使用選項使用
$ man grep
</div>關于正則表達式的學習可以看 Python正則表達式
xargs命令
xargs參數說明
# 將多行輸出轉化為單行輸出
$ cat test.doc|xargs
$ cat new .pdf| xargs -n 5
Here you can select if
you want to set the
gesture for Magic Mouse or
for the Trackpad or for
the Keyboard
</div>其他常用小命令
# 清空文件
$ :> a.txt
# 將文本中的制表符轉換為空格
$ cat text| tr '\t' ' ' //制表符轉空格
# 統計行數, 常用統計整個項目的代碼量
$ wc -l file
# 打包當前文件夾(不壓縮), -c為打包選項, -v為顯示打包進度, -f為使用檔案文件
$ tar -cvf test.tar ./
# 解包 -x為解包選項
$ tar -xvf test.tar
# 壓縮文件, 生成文件為.gz后綴
$ gzip test.tar
# 解壓縮文件, 解壓為test.tar
$ gzip test.tar.gz
# 查看端口占用的進程狀態
$ lsof -i: 5000
# 端口號被占用:
$ sudo netstat -tulpn | grep 80
$ sudo netstat -aWn --programs | grep 80
# 查詢被監聽的端口
$ lsof -i tcp | grep LISTEN
# 通過PID進程號殺死進程
$ sudo kill -s (PID)
# DNS查詢,尋找域名domain對應的IP
$ host andrewliu.tk
andrewliu.tk has address 103.245 .222 .133
# SSH登陸:
$ ssh username@host
# ftp/sftp文件傳輸(重要)
$ sftp username@host
# 遠程文件復制, scp -r 要復制的整個目錄 username@host:目的目錄
$ $scp localpath ID@host:path
$ scp -r MonitorTrend bin_liu@ 10.64 .24 .91 :Flask
# 添加新的用戶和密碼
$ useradd -m username
$ passwd username
# 刪除用戶
$userdel -r username
# 不同用戶之間切換
$ su userB
</div> </div> </div> 原文 http://andrewliu.in/2015/07/31/Shell命令find-grep-xargs學習/