linux shell 學習摘記(2)

onephone發表於2016-09-28

《linux shell 指令碼程式設計攻略 (第2版)》 第二章 “命令之樂” 筆記

主要命令: cat, script, scriptreplay, find -exec, xargs, tr, md5sum, sha1sum, md5dep, crypt, gpg, base64, opensslpasswd, sort, uniq, mktemp, split, csplit, ${URL%*.}, ${URL##*.}, rename, look, echo -e, grep -q, PIDARRAY+=("$!"), expect

  • -被作為stdin文字的檔名,如echo "hello" | cat - file.txt

  • cat -s file.txt 可壓縮相鄰的空白行; cat -T file.py 能將製表符標記成^|(對python等檔案很有用); cat -n 顯示行號(其也會為空白行新增行號,加-b可跳過空白符)

  • 錄製並回放終端會話

    1. 開始錄製會話script -t 2> timing.log -a output.session,錄製完後鍵入exit退出,最後通過scriptreplay timing.log output.session回放
    2. timing.log 用來存在時序資訊(-t參數列示將時序資訊重定向到stderr) output.session 儲存命令輸出資訊
  • find

    1. find . -name "*.txt"find . -iname "example*"忽略大小寫
    2. find . \( -name "*.txt" -o -name "*.sh" \) 列印出所有的.txt和.sh檔案
    3. find /home/swf -path "*/hello/*" 使用-path來匹配檔案路徑;find . -iregex ".*\(\.py\|\.sh\)$" 通過正規表示式來匹配.py和.sh檔案,且忽略find . -iregex ".*\(\.py\|\.sh\)$"忽略大小寫
    4. find . ! -name "*.txt" 否定查詢
    5. find . -maxdepth 3 -mindepth 1 -name "f*" 基於目錄深度的搜尋
    6. find . -type d 查詢目錄(f/l/c/b/s/p),s表示套接字裝置,p表示FIFO
    7. -atime -mtime -ctime 訪問時間、檔案內容修改時間、檔案後設資料修改時間(許可權、所有權);-atime -7表示最近7天內,-atime 7恰好在七天前, -atime +7 超過七天, 如find . -type f -atime +7; 類似的有-amin -mmin -cmin(基於分鐘的引數)
    8. -size +2k, -size 2k, -size -2k按檔案大小(大於,等於,小於)
    9. 刪除當前目錄下的.swp檔案,find . -type f -perm 644 -name "*.swp" -delete
    10. find . -name "*.c" -exec cat {} \; > all_c_files.txt find同命令結合
    11. find . \( -name ".git" -prune \) -o \( -type f -print \) 不包含在.git目錄中的所有檔名(若前者為真則後者不執行)
  • xargs能把從stdin接收到的資料重新格式化,再將其作為引數提供給其他命令

    1. cat example.txt | xargs -d X -n 3 以X為定界符, 每行2個引數
    2. cat args.txt | xargs -n 1 ./cecho.sh, cat args.txt | xargs -I {} ./cecho.sh -p {} -l,其中{}會進行擴充
    3. 刪除特定系列檔案find . -type f -name "*.txt" -print0 | xargs -0 rm -rf"
    4. 統計每個檔案的行數和總行數 find . -type -f -name "*.md" -print0 | xargs -0 wc -l
  • cat files.txt | ( while read arg; do cat $arg; done; )相當於cat files.txt | xargs -I {} cat {}

  • echo file.txt | tr 'a-zA-Z' 'n-za-mN-ZA-M'tr -d '0-9'刪除指定集合中的字元, tr -d -c '0-9 \n'將不在集合中的所有字元刪除,tr -s ' '`將連續空格壓縮為一個空格

    1. 將檔案中的數字疊加 cat sum.txt | echo $[ $( tr '\n' '+' ) 0]
    2. 支援字元類 tr [:lower:] [:upper:]
  • 加密和雜湊

    1. md5sum -c *.md5, sha1sum -c *.sha1 檢查校驗和
    2. 對目錄進行校驗 md5dep -rl . > dircetory.md5(-r 遞迴方式, -l 相對路徑); find . -type f -print0 | xargs -0 md5sum >> directory.md
    3. crypt <input_file >output_file加密, crypt PASSPARSE -d <encryptedfile >outputfile解密;gpg -c filename加密,gpg filename.gpg解密; base64 -d file > outputfile
    4. shadow-like雜湊, salt --> opensslpasswd -1 -salt SALTSTRING PASSWORD(類似/etc/shadow)維基參考
  • sort -nrk 1 data.txt -nr表明按照數字,採用逆序排列(預設是按照字母表排序), -k 1表示按照第一列排序;sort -z data.txt | xargs -0; sort -bd unsorted.txt -b忽略檔案中的前導空白行,-d表明用字典排序

  • uniq -u sorted.txt只顯示第一行,-c統計各行出現的次數, -d 找出重複的行;sort data.txt | uniq -s 2 -w 2 -s指定可以跳過前2個字元;-w指定用於比較的最大字元數;uniq -z file.txt | xargs -o rm

  • mktemp -d, mktemp test.XXX根據模版建立臨時檔案,(保證至少有3個X)

  • split -b 10k data.file -d -a 4 splitfile -d 表示以數字為字尾, -a 表示字尾長度;-l可以通過行來進行切分。但split只能通過檔案大小和行來進行切分

  • csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log" ; rm server00.log 按日誌檔案中的某個單詞或內容進行切割。

    1. /[REGEX]/表示文字樣式,用來匹配某一行
    2. {*} 表示匹配重複的次數,中間數字若為*則表示匹配直到檔案結尾
    3. -s靜態模式, -n 分割後的檔名字尾的數字數, -f 分割後的檔名字首, -b 指定字尾格式(同fprint)
  • 副檔名切分, %表示從右向左進行匹配,刪除匹配的到的內容(非貪婪),%%同%但是貪婪匹配#表示從左向右匹配,刪除匹配到的內容(非貪婪),##同#但是**貪婪匹配 此處有指令碼

  • rename 's/ /_/g' * 將檔名中的空格替換成字元_rename 'y/A-Z/a-z/' *轉換檔名的大小; find . -type f -name "*.mp3" -exec mv {} targetdir \; 移動mp3檔案到特定的目錄下;find . -type -f -exec rename 's/ /_/g' {} \;

  • [ -z $output ] 用於判斷output是否為空

  • grep "^word" /usr/share/dict/words -q; look word列出預設字典中所有的單詞, look word /home/wenfeng/test.txt列出檔案中以word起頭的所有單詞

  • echo -e "\nhello\n" expect可實現互動式輸入

  • 利用並行程式進行加速 $!最近一個後臺程式的PID 此處有指令碼

相關文章