日誌分析必備指令集【來自一段線上日誌的檢視的經歷】

caoweiju發表於2018-12-18

線上日誌檢視基礎

檢視線上機器的一些資訊和基礎命令:

  • du、df檢視大小相關
  • cat、zcat、less、tail、head檢視檔案內容
  • grep、awk處理檔案內容
  • sort、uniq、wc統計
  • scp檔案傳輸

du、df檢視大小相關

  1. df 檢視系統掛載磁碟大小

    • df [選項]... [FILE]...
      檔案-a, –all 包含所有的具有 0 Blocks 的檔案系統
      檔案--block-size={SIZE} 使用 {SIZE} 大小的 Blocks
      檔案-h, –human-readable 使用人類可讀的格式(預設值是不加這個選項的…)
      檔案-H, –si 很像 -h, 但是用 1000 為單位而不是用 1024
      檔案-i, –inodes 列出 inode 資訊,不列出已使用 block
      檔案-k, –kilobytes 就像是 –block-size=1024
      檔案-l, –local 限制列出的檔案結構
      檔案-m, –megabytes 就像 –block-size=1048576
      檔案--no-sync 取得資訊前不 sync (預設值)
      檔案-P, –portability 使用 POSIX 輸出格式
      檔案--sync 在取得資訊前 sync
      檔案-t, –type=TYPE 限制列出檔案系統的 TYPE
      檔案-T, –print-type 顯示檔案系統的形式
      檔案-x, –exclude-type=TYPE 限制列出檔案系統不要顯示 TYPE
      檔案-v (忽略)

      常見使用例項:

      df -h
  2. du會顯示指定的目錄或檔案所佔用的磁碟空間

    • du [-abcDhHklmsSx][-L <符號連線>][-X <檔案>][--block-size][--exclude=<目錄或檔案>][--max-depth=<目錄層數>][--help][--version][目錄或檔案]
      引數說明:
      -a或-all 顯示目錄中個別檔案的大小。
      -b或-bytes 顯示目錄或檔案大小時,以byte為單位。
      -c或--total 除了顯示個別目錄或檔案的大小外,同時也顯示所有目錄或檔案的總和。
      -D或--dereference-args 顯示指定符號連線的原始檔大小。
      -h或--human-readable 以K,M,G為單位,提高資訊的可讀性。
      -H或--si 與-h引數相同,但是K,M,G是以1000為換算單位。
      -k或--kilobytes 以1024 bytes為單位。
      -l或--count-links 重複計算硬體連線的檔案。
      -L<符號連線>或--dereference<符號連線> 顯示選項中所指定符號連線的原始檔大小。
      -m或--megabytes 以1MB為單位。
      -s或--summarize 僅顯示總計。
      -S或--separate-dirs 顯示個別目錄的大小時,並不含其子目錄的大小。
      -x或--one-file-xystem 以一開始處理時的檔案系統為準,若遇上其它不同的檔案系統目錄則略過。
      -X<檔案>或--exclude-from=<檔案> 在<檔案>指定目錄或檔案。
      --exclude=<目錄或檔案> 略過指定的目錄或檔案。
      --max-depth=<目錄層數> 超過指定層數的目錄後,予以忽略。
      使用例項:檢視當前資料夾的一級內容大小

      du -h --max-depth=1

cat、zcat、less、tail、head檢視檔案內容

  1. cat 命令用於連線檔案並列印到標準輸出裝置上

    • cat [-AbeEnstTuv] [--help] [--version] fileName

      `-n 或 --number`:由 1 開始對所有輸出的行數編號。
      `-b 或 --number-nonblank`:和 -n 相似,只不過對於空白行不編號。
      `-s 或 --squeeze-blank`:當遇到有連續兩行以上的空白行,就代換為一行的空白行。
      `-v 或 --show-nonprinting`:使用 ^ 和 M- 符號,除了 LFD 和 TAB 之外。
      `-E 或 --show-ends` : 在每行結束處顯示 $。
      `-T 或 --show-tabs`: 將 TAB 字元顯示為 ^I。
      `-A, --show-all`:等價於 -vET。
      `-e`:等價於`"-vE"`選項;
      `-t`:等價於`"-vT"`選項;
      
  2. zcatt命令用於不真正解壓縮檔案,就能顯示壓縮包中檔案的內容的場合。
  3. head顯示檔案的開頭至標準輸出中,預設head命令列印其相應檔案的開頭10行

    • head [引數]... [檔案]...

      `-q` 隱藏檔名
      `-v` 顯示檔名
      `-c<位元組>` 顯示位元組數
      `-n<行數>` 顯示的行數
      
  4. tail用於檢視檔案的內容,有一個常用的引數 -f 常用於查閱正在改變的日誌檔案

    • tail[必要引數][選擇引數][檔案]

      `-f` 迴圈讀取
      `-q` 不顯示處理資訊
      `-v` 顯示詳細的處理資訊
      `-c<數目>` 顯示的位元組數
      `-n<行數>` 顯示行數
      `--pid=PID 與-f合用`,表示在程式ID,PID死掉之後結束. 
      `-q, --quiet, --silent` 從不輸出給出檔名的首部 
      `-s, --sleep-interval=S 與-f合用`,表示在每次反覆的間隔休眠S秒 
  5. less可以隨意瀏覽檔案

    • less [引數] 檔案

      `-b <緩衝區大小>` 設定緩衝區的大小
      `-e`  當檔案顯示結束後,自動離開
      `-f`  強迫開啟特殊檔案,例如外圍裝置代號、目錄和二進位制檔案
      `-g`  只標誌最後搜尋的關鍵詞
      `-i`  忽略搜尋時的大小寫
      `-m`  顯示類似more命令的百分比
      `-N`  顯示每行的行號
      `-o <檔名>` 將less 輸出的內容在指定檔案中儲存起來
      `-Q`  不使用警告音
      `-s`  顯示連續空行為一行
      `-S`  行過長時間將超出部分捨棄
      `-x <數字>` 將“tab”鍵顯示為規定的數字空格
      `/字串`:向下搜尋“字串”的功能
      `?字串`:向上搜尋“字串”的功能
      `n`:重複前一個搜尋(與 / 或 ? 有關)
      `N`:反向重複前一個搜尋(與 / 或 ? 有關)
      `b`  向後翻一頁
      `d`  向後翻半頁
      `h`  顯示幫助介面
      `Q`  退出less 命令
      `u`  向前滾動半頁
      `y`  向前滾動一行
      `空格鍵` 滾動一行
      `Enter鍵` 滾動一頁
      `[pagedown]`: 向下翻動一頁
      `[pageup]`:   向上翻動一頁
      

grep、awk處理檔案內容

  1. grep用於查詢檔案裡符合條件的字串。

    • grep [-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>][-d<進行動作>][-e<範本樣式>][-f<範本檔案>][--help][範本樣式][檔案或目錄...]
      -a 或 --text : 不要忽略二進位制的資料。
      -A<顯示行數> 或 --after-context=<顯示行數> : 除了顯示符合範本樣式的那一列之外,並顯示該行之後的內容。
      -b 或 --byte-offset : 在顯示符合樣式的那一行之前,標示出該行第一個字元的編號。
      -B<顯示行數> 或 --before-context=<顯示行數> : 除了顯示符合樣式的那一行之外,並顯示該行之前的內容。
      -c 或 --count : 計算符合樣式的列數。
      -C<顯示行數> 或 --context=<顯示行數>或-<顯示行數> : 除了顯示符合樣式的那一行之外,並顯示該行之前後的內容。
      -d <動作> 或 --directories=<動作> : 當指定要查詢的是目錄而非檔案時,必須使用這項引數,否則grep指令將回報資訊並停止動作。
      -e<範本樣式> 或 --regexp=<範本樣式> : 指定字串做為查詢檔案內容的樣式。
      -E 或 --extended-regexp : 將樣式為延伸的普通表示法來使用。
      -f<規則檔案> 或 --file=<規則檔案> : 指定規則檔案,其內容含有一個或多個規則樣式,讓grep查詢符合規則條件的檔案內容,格式為每行一個規則樣式。
      -F 或 --fixed-regexp : 將樣式視為固定字串的列表。
      -G 或 --basic-regexp : 將樣式視為普通的表示法來使用。
      -h 或 --no-filename : 在顯示符合樣式的那一行之前,不標示該行所屬的檔名稱。
      -H 或 --with-filename : 在顯示符合樣式的那一行之前,表示該行所屬的檔名稱。
      -i 或 --ignore-case : 忽略字元大小寫的差別。
      -l 或 --file-with-matches : 列出檔案內容符合指定的樣式的檔名稱。
      -L 或 --files-without-match : 列出檔案內容不符合指定的樣式的檔名稱。
      -n 或 --line-number : 在顯示符合樣式的那一行之前,標示出該行的列數編號。
      -q 或 --quiet或--silent : 不顯示任何資訊。
      -r 或 --recursive : 此引數的效果和指定”-d recurse”引數相同。
      -s 或 --no-messages : 不顯示錯誤資訊。
      -v 或 --revert-match : 顯示不包含匹配文字的所有行。
      -V 或 --version : 顯示版本資訊。
      -w 或 --word-regexp : 只顯示全字元合的列。
      -x --line-regexp : 只顯示全列符合的列。
      -y : 此引數的效果和指定”-i”引數相同。
  2. awk處理文字檔案的語言,是一個強大的文字分析工具。

    • awk `{pattern + action}` {filenames}或者awk [-F field-separator] `commands` input-file(s)
    1. awk -F, `$2 ~ /test/ {print $2" "$4}` log.txt
      使用-F,的作用是每行按照,分割,$1$2$n就是分割的結果的對應順序的值
      $2 ~ /th/就是需要分割的第二個資料需要和test匹配的上
      {print $2$4}輸出分割結果的第二個和第四個
      處理的資訊是log.txt
    2. awk -F `[:=]` `{match($5,/.*uc_name=(.*)&extend=test.*/,a); print a[1]}` log.txt
      -F `[:=]`使用多個分隔符,先使用:分割,然後在對分割結果使用=二次分割。
      `{match($5,/.*uc_name=(.*)&extend=test.*/,a); print a[1]}`對分割後的第五個結果處理,需要能夠匹配上其中的正則,並把匹配結果放到陣列a中,其中a陣列的結果a[0]是全匹配的結果,a[1]是正則匹配的子表示式結果,並輸出子表示式。

sort、uniq、wc統計

  1. sort用於將文字檔案內容加以排序。

    • sort [-bcdfimMnr][-o<輸出檔案>][-t<分隔字元>][+<起始欄位>-<結束欄位>][--help][--verison][檔案]
      -b 忽略每行前面開始出的空格字元。
      -c 檢查檔案是否已經按照順序排序。
      -d 排序時,處理英文字母、數字及空格字元外,忽略其他的字元。
      -f 排序時,將小寫字母視為大寫字母。
      -i 排序時,除了040至176之間的ASCII字元外,忽略其他的字元。
      -m 將幾個排序好的檔案進行合併。
      -M 將前面3個字母依照月份的縮寫進行排序。
      -n 依照數值的大小排序。
      -o<輸出檔案> 將排序後的結果存入指定的檔案。
      -r 以相反的順序來排序。
      -t<分隔字元> 指定排序時所用的欄位分隔字元。
      +<起始欄位>-<結束欄位> 以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。
  2. uniq用於檢查及刪除文字檔案中重複出現的行列,需要與 sort 命令結合使用[一定要排序,不然去重無效,只會去除相鄰的重複項]

    • uniq [-cdu][-f<欄位>][-s<字元位置>][-w<字元位置>][--help][--version][輸入檔案][輸出檔案]
      -c或--count 在每列旁邊顯示該行重複出現的次數。
      -d或--repeated 僅顯示重複出現的行列。
      -f<欄位>或--skip-fields=<欄位> 忽略比較指定的欄位。
      -s<字元位置>或--skip-chars=<字元位置> 忽略比較指定的字元。
      -u或--unique 僅顯示出一次的行列。
      -w<字元位置>或--check-chars=<字元位置> 指定要比較的字元。
  3. wc計算檔案的Byte數、字數、或是列數,若不指定檔名稱、或是所給予的檔名為”-“,則wc指令會從標準輸入裝置讀取資料。

    • uniq [-cdu][-f<欄位>][-s<字元位置>][-w<字元位置>][--help][--version][輸入檔案][輸出檔案]
      -c或--bytes或--chars 只顯示Bytes數。
      -l或--lines 只顯示行數。
      -w或--words 只顯示字數。

scp檔案傳輸

  1. scplinux系統下基於ssh登陸進行安全的遠端檔案拷貝命令[需要配置ssh登入,密碼或者公鑰免密]

    • scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 [...] [[user@]host2:]file2
      -1: 強制scp命令使用協議ssh1
      -2: 強制scp命令使用協議ssh2
      -4: 強制scp命令只使用IPv4定址
      -6: 強制scp命令只使用IPv6定址
      -B: 使用批處理模式(傳輸過程中不詢問傳輸口令或短語)
      -C: 允許壓縮。(將-C標誌傳遞給ssh,從而開啟壓縮功能)
      -p:保留原檔案的修改時間,訪問時間和訪問許可權。
      -q: 不顯示傳輸進度條。
      -r: 遞迴複製整個目錄。
      -v:詳細方式顯示輸出。scp和ssh(1)會顯示出整個過程的除錯資訊。這些資訊用於除錯連線,驗證和配置問題。
      -c cipher: 以cipher將資料傳輸進行加密,這個選項將直接傳遞給ssh。
      -F ssh_config: 指定一個替代的ssh配置檔案,此引數直接傳遞給ssh。
      -i identity_file: 從指定檔案中讀取傳輸時使用的金鑰檔案,此引數直接傳遞給ssh。
      -l limit: 限定使用者所能使用的頻寬,以Kbit/s為單位。
      -o ssh_option: 如果習慣於使用ssh_config(5)中的引數傳遞方式,
      -P port:注意是大寫的P, port是指定資料傳輸用到的埠號
      -S program: 指定加密傳輸時所使用的程式。此程式必須能夠理解ssh(1)的選項。

實踐

線上日誌結構:

183.250.223.158 [16/Dec/2018:23:57:15 +0800] "GET /log?skdata=sdadadad111%22username%33%3ftestets%22fsfdsfssadadasd%34fdsfs%34  HTTP/1.0" 200 2 "-" "testiPhone/d64556" "120.188.90.136" "jsdgajdsad" "dasdadd" "test" "ceshi"

分析資料命令:

cat /home/logs/2018/12/access.2018-12-16.log | grep -E  `skdata.*username` | awk `{match($5,/.*username%33%3f(.*)%22fsfdsfssadadasd.*/,a); print a[1]}` | sort | uniq -c | wc -l
  1. cat檢視某一天的日誌檔案,訪問日誌一般檔案一天記錄一份
  2. grep檢視符合需求的訪問日誌,本例項使用正則匹配-E來篩選出符合要求的詳情頁訪問日誌,輸出
  3. awk分析符合要求的詳情頁訪問日誌,把每行詳情頁訪問日誌中$5【空格分割的第五個字串,本例項就是以/log?開頭的字串】去匹配一個正則.*username%33%3f(.*)%22fsfdsfssadadasd.*,並把結果放到變數a中【a[0]是全匹配,a[1]是第一個字表示式】,然後把匹配成功符合結果的a[1]輸出
  4. sort將上述結果排序 [一定要排序,不然去重無效,只會去除相鄰的重複項]
  5. uniq -c將上述結果去重
  6. wc -l檢視總共結果數量

相關文章