大部分專案在部署後都會專案中新增日誌檔案一些記錄檔案,而我們經常需要分析或者處理相關檔案中的字元,所以掌握linux字元處理命令非常重要。
舉個例子:後端提供某個介面,接收請求的時候其中乙個引數死活收不到,但你確信這個引數是百分百已傳送的,於是你檢視請求記錄日誌檔案,找出所有傳送記錄資料,與後端同學一起排錯(撕逼)。
再舉個例子:某個檔案中儲存了許多使用者相關的資料,現在要將這些資料寫入資料庫中,但是這些資料中有很多重複資料,並且這些資料中有很多無用符號等。如果在程式中對檔案不停的進行查詢與替換資料,必然會拖慢程式的速度,如果使用linux命令把檔案中的重複資料與無用資料給清楚,是不是處理器來就方便很多了。
建立兩個簡單檔案,分別為1.txt、2.txt,下文用這兩個檔案來做示範
# 1.txt
a:aa1
b:b1
***c:c1
***d:d1
:end
# 2.txt
a:a2
b:b2
***c:c2
***d:d2
:end2
輸油管、輸氣管是現實生活中的管道,linux中也存在管道,它是乙個4kb的快取區,當我們要輸出的檔案內容太多的情況下在終端中可能會翻屏的現象導致之前的內容不能檢視,這個時候管道就可以派上用場了。
舉個例子,檢視系統程式二進位制檔案bash內容
more /bin/bash
# 檢視目錄清單,如果目錄清單夠多的話,也會觸發管道
因為「/bin/bash」是二進位制檔案,所以上圖**現了亂碼;
在內容超出4kb的情況下輸出結果中會出現冒號,鍵盤上下鍵可來回翻看,是不是像一根管道呢;
grep regex [file...] [-rivlnc]
# -r: 資料夾遞迴查詢模式
# -i:查詢匹配時忽略大小寫
# -v:顯示不匹配的行
# -l:列出匹配模式的檔名稱
# -n:列出檢索目標所在的行號
# -c:統計匹配的行總數,不顯示行資訊
grep以行為單位查詢,
包含3個引數,「regex」為字串或者正規表示式, 「file」為檔案或者資料夾名,-r為結果篩選選項。
基礎用法
# 查詢帶「:」的內容
按正規表示式查詢
# 查詢符合正規表示式的資料行
資料夾遞迴查詢
# test 表示資料夾
grep "^\\w\:\\w\$" test -r
# 查詢內容太多的情況下可以使用管道
grep "^\\w\:\\w\$" test -r | more
sort [file] [-urontkkfbc]
#u 去重
#r 降序
#o 寫入檔案
#n 以數字順序排列
#t 設定查詢分隔符
#k 一般與-t一起使用,用來按照第幾列來排序
#f 忽略大小寫
#b 忽略每一行前列空白
#c 內容是否已排序
基礎用法sort 1.txt
sort將檔案的每一行作為乙個單位,預設按照首字母scii碼值排序,很多的時候排序返回結果並不符合我們的需求,所以需要用到sort提供的其他選項了。
分隔內容排序
# 按照冒號分隔內容,並且使用第2列資料進行排序,不存在第二列資料的情況下,linux預設使用空字串填充
sort -t: -k 2 1.txt
排序內容輸出到新的檔案# 使用-o選項
sort 1.txt -o new1.txt;
# 當然也可以使用 >
sort 1.txt > new2.txt
去重uniq [-i-c]
# -i 忽略大小寫
# -c 查詢行數
返回結果中存在兩個「***」,是uniq去重指的是連續兩行或者多行相同的內容,所以uniq一般都是與sort配合一起使用。
sort 1.txt -u
sort 1.txt | uniq
cut [-df]
# -d 自定義分隔符
# -f 指定的列,一般與-d一起使用
cat 1.txt | cut -d ':' -f 2
使用了 -f 引數如果指定列不存在,程式首先會查詢分隔符是否存在,如果整行資料中存在分隔符的情況下則使用空格代替,如果不存在則使用整行資料返回輸出。
tr [-cdst]
# -s squeeze-repeats:把連續重複的字元以單獨乙個字元表示;例如「aa」=>「a」
# -d delete:刪除所有屬於第一字符集的字元;
# 小寫轉化為大寫
cat 1.txt | tr "[a-z]" [a-z]
# 如果兩個「a」字元連在一起會被當做乙個「a」處理
cat 1.txt | tr -s "a" "z"
# 刪除數字字符集
cat 1.txt | tr -d "[0-9]"
# 刪除「a」與「:」
cat 1.txt | tr -d "a:"
tr命令只能按照按照字符集對映替換處理,比如「a-a,b=>」,不支援正規表示式。
也不支援連續的字串替換成特定的字串,比如「abc」替換成「xyz」,如果這樣進行處理的話,程式會進行對映替換「a=>x,b=>y,c=>z」。
tr命令比較簡單,但是功能太弱了,一般值用來替換刪除大小寫數字之模擬較特殊的字元對映替換。
paste [-d] [file] [targetfile]
# -d 合併分隔符,預設為「 」空格字串
# 普通合併
paste -d 「1.txt」 "2.txt"
# 設定分隔符為「:」,
paste -d ":" "1.txt" "2.txt" > "new.txt"
文字合併並不是將b文字內容附加在a文字內容後面,而是將b文字每一行內容附加在a文字對應行號內容後面。
文字合併使用場景很少。
檔案分割
split [-bl] [filename] [target_prefix]
# -b 按大小分割
# -l 按行數分割
# 按每個檔案大小2k進行分割
split -b 2k "1.txt" "new"
# 按每個檔案5行文字進行大小分割
split -l 5 "1.txt" "new"
二進位制文字是沒有行號的,只能按大小分割
檔案合併
cat new* > "target.txt"
使用場景舉例
正規表示式
linux 字元處理
2010 08 05 19 15 linux 系統中很多檔案都是純文字檔案,如配置檔案和日誌檔案。系統管理時對這些檔案的處理顯得尤為重要,系統中帶有很多經典的字元處理命令,他們在系統管理和指令碼編寫時有很強大的功能,這些命令包括cut,diff,expand unexpand,grep,head t...
Linux 字元處理命令
sort 選項 檔案 什麼都不加,預設按照首字母排序,預設以空格為分隔符。t 指定分隔符,預設使用空格為分隔符。k 指定第幾列。root oldboy cat sort.log sort t k2 218.65.30.124 17163 218.65.30.126 17163 218.65.30.2...
180902 Linux 字元處理
linux中的管道是乙個固定大小的緩衝區,大小為1頁 4k位元組 管理可以將兩個程序連線起來,即可以將前乙個命令的輸出當作下乙個命令的輸入 管理使用 連線兩個命令。示例 grep是基於行的文字搜尋工具,其會列印出匹配到的所有行。命令使用 grep ivnc 要匹配的字元 檔名 引數說明 i 忽略要匹...