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

線上日誌查看基礎

查看線上機器的一些信息和基礎命令:

  • 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`  向前滾動一行
      `空格鍵` 滾動一行
      `回車鍵` 滾動一頁
      `[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"\t"$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.*prodetail.*etype%2522%253A0.*eid.*theme_prodetail.*vs_theme' | awk '{match($5,/.*uc_name%2522%253A%2522(.*)%2522%252C%2522etype.*/,a); print a[1]}' | sort | uniq -c | wc -l
  1. cat查看某一天的日誌文件,訪問日誌一般文件一天記錄一份
  2. grep查看符合需求的訪問日誌,本實例使用正則匹配-E來篩選出符合要求的詳情頁訪問日誌,輸出
  3. awk分析符合要求的詳情頁訪問日誌,把每行詳情頁訪問日誌中$5【空格分割的第五個字符串,本實例就是以/log?開頭的字符串】去匹配一個正則.*uc_name%2522%253A%2522(.*)%2522%252C%2522etype.*,並把結果放到變量a中【a[0]是全匹配,a[1]是第一個字表達式】,然後把匹配成功符合結果的a[1]輸出
  4. sort將上述結果排序 [一定要排序,不然去重無效,只會去除相鄰的重複項]
  5. uniq -c將上述結果去重
  6. wc -l查看總共結果數量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章