資料流處理命令
1. awk:文字和資料處理工具
awk擅長於對資料進行分析並生成報告,簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。
使用方法:awk '{pattern + action}' {filenames}
其中pattern 表示awk 在資料中查詢的內容,而action是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。pattern就是要表示的正規表示式,用斜槓括起來。準備例項操作檔案:netstat -t >> netstat.txt
1.1 列印輸出:
print,格式化列印輸出:printf
awk '{print$1, $4}' netstat.txt awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt
1.2 過濾記錄:
awk '$3==0 && $6=="LISTEN"' netstat.txt
其中的“==”為比較運算子。其他比較運算子:!=,>, <, >=, <=
awk '$3>0 {print $0}' netstat.txt
加入表頭:內建變數NR
awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.txt
再加上格式化輸出
awk '$3 ==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt
ps:awk的內建變數
$0 當前記錄(這個變數中存放著整個行的內容) $1~$n 當前記錄的第n個欄位,欄位間由FS分隔 FS 輸入欄位分隔符預設是空格或Tab NF 當前記錄中的欄位個數,就是有多少列 NR 已經讀出的記錄數,就是行號,從1開始,如果有多個檔案話,這個值也是不斷累加中。 FNR 當前記錄數,與NR不同的是,這個值會是各個檔案自己的行號 RS 輸入的記錄分隔符,預設為換行符 OFS 輸出欄位分隔符,預設也是空格 ORS 輸出的記錄分隔符,預設為換行符 FILENAME 當前輸入檔案的名字
輸出行號:
awk '$3 ==0 && $6=="ESTABLISHED"|| NR==1 {printf "%02s %s %-20s %-20s %s\n",NR, FNR,$4,$5,$6}' netstat.txt
指定分隔符:
awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
或者awk -F:
'{print $1,$3,$6}' /etc/passwd
以\t作為分隔符輸出:
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
1.3 字串匹配:
~表示匹配模式開始,正規表示式匹配。
awk '$6 ~ /TIME/ || NR ==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt awk '$6 ~ /ESTABLISHED/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt awk '/LISTEN/' netstat.txt
使用“/TIME|ESTABLISHED/” 來匹配TIME 或者ESTABLISHED :
awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
模式取反:!~
awk '$6 !~ /TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
或者awk '!/WAIT/' netstat.txt
1.4 拆分檔案:
使用資料流重定向”>”
awk 'NR!=1 {print > $6}' netstat.txt NR!=1表示不處理表頭
把指定的列輸出到檔案:
awk 'NR!=1{print $4,$5 > $6}' netstat.txt
使用程式流進行條件拆分:if else
awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt"}' netstat.txt
1.5 統計
計算所有的C檔案,CPP檔案和H檔案的檔案大小總和:
ls -l *.cpp *.c*.h | awk '{sum+=$5} END {print sum}'
統計各個connection狀態的用法:使用陣列
awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a;}' netstat.txt
統計每個使用者的程式的佔了多少記憶體:
ps aux| awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a"KB";}'
陣列:因為awk中陣列的下標可以是數字和字母,陣列的下標通常被稱為關鍵字(key)。值和關鍵字都儲存在內部的一張針對key/value應用hash的表格裡。由於hash不是順序儲存,因此在顯示陣列內容時會發現,它們並不是按照你預料的順序顯示出來的。陣列和變數一樣,都是在使用時自動建立的,awk也同樣會自動判斷其儲存的是數字還是字串。一般而言,awk中的陣列用來從記錄中收集資訊,可以用於計算總和、統計單詞以及跟蹤模板被匹配的次數等等。
1.6 使用指令碼進行文字、資料處理
BEGIN、END關鍵字:BEGIN表示處理所有行之前的標識,END表示處理完所有行後的標識,具體語法:
BEGIN { 這裡面放的是執行前的語句}
END {這裡面放的是處理完所有的行後要執行的語句}
{這裡面放的是處理每一行時要執行的語句}
例項操作檔案:cat cal.awk
#!/bin/awk -f #執行前 BEGIN { math= 0 english= 0 computer= 0 printf"NAME NO. MATH ENGLISH COMPUTER TOTAL\n" printf"---------------------------------------------\n" } #執行中 { math+=$3 english+=$4 computer+=$5 printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5 } #執行後 END{ printf"---------------------------------------------\n" printf "TOTAL:%10d %8d %8d \n", math, english, computer printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR,computer/NR }
執行:awk -f cal.awk score.txt
1.7 變數宣告和環境變數:
使用-v引數進行變數宣告,ENVIRON關鍵字表示環境變數
$ x=5 $ y=10 $ export y #y被export為環境變數 $ echo $x $y 5 10 $awk -v val=$x '{print $1, $2, $3, $4+val, $5+ENVIRON["y"]}' OFS="\t" score.txt
2. sed:流編輯器
stream editor,流編輯器,用程式的方式來編輯文字,正規表示式進行模式匹配。sed本身是一個管道命令,可以分析standard input,也可以將資料進行替換、刪除、新增、擷取特定行等功能。
演示文字:catpets.txt
This is my cat my cat's name is betty This is my dog my dog's name is frank This is my fish my fish's name is george This is my goat my goat's name is adam
使用:sed [-nefr] action
action:-i直接修改讀取的檔案內容,而不是由螢幕輸出,-r表示支援延伸型正規表示式的語法。
動作說明:[n1[,n2]] function n1,n2表示要選擇的行數,function包括:
a-新增,c-取代,d-刪除,i-插入,p-列印,s-取代(可以直接進行取代的工作,例如 1,20s/old/new/g)
2.1 用s命令進行替換
my字串替換成Rango Chen’s
sed “s/my/Rango Chen's/g” pets.txt
ps:如果使用單引號,則無法透過\'來轉義。該命令並沒有對檔案內容進行更改,只是把處理過後的內容輸出,如果你要寫回檔案,你可以使用重定向:
sed "s/my/Rango Chen's/g" pets.txt >Chen_pets.txt
,或者使用-i選項:
sed -i “s/my/Rango Chen's/g” pets.txt
s表示替換動作,/g表示一行上的替換所有的匹配。
在每一行最前面加上#:
sed 's/^/#/g' pets.txt
在每一行的末尾加上---:
sed 's/$/ --- /g' pets.txt
基礎的正則表示法特殊字元:
^ 表示一行的開頭。如:/^#/ 以#開頭的匹配。 $ 表示一行的結尾。如:/}$/ 以}結尾的匹配。 \< 表示詞首。如\<abc 表示以abc 為首的詞。 \> 表示詞尾。如 abc\> 表示以abc 結尾的詞。 \ 將特殊字元進行轉義,還原其本身意義:grep -n \' pets.txt 搜尋含有單引號'的那一行。 . 表示任何單個字元。 * 表示某個字元出現了0次或多次。 [ ] 字符集合。如:[abc]表示匹配a或b或c,還有[a-zA-Z]表示匹配所有的26個字元。如果其中有^表示取反,如[^a]表示非a的字元 \{n,m\} 連續n到m個的“前一個RE字元” grep -n 'go\{2,3\}g' 1.txt 在g與g之間有2到3個o存在的字串,亦即(goog)(gooog)
去掉某html中的tags:
html.txt:
<b>This</b>is what <span style="text-decoration:underline;">I</span> meant. Understand?
sed 's/<[^>]*>//g' html.txt
只替換第3到第6行的文字:
sed "3,6s/my/your/g" pets.txt
只替換第3行的文字:
sed "3s/my/your/g" pets.txt
只替換每一行的第一個s:
sed 's/s/S/1' my.txt 1表示第一個
只替換每一行的第二個s:
sed 's/s/S/2' my.txt 2表示第二個
只替換第一行的第3個以後的s:
sed 's/s/S/3g' my.txt
2.2 多個匹配
一次替換多個模式,每個模式之間用;進行間隔:
sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt
上面的命令等價於:
sed -e'1,3s/my/your/g' -e '3,$s/This/That/g' my.txt
使用&來當做被匹配的變數,加入一些字元:
sed 's/my/[&]/g' my.txt
此命令相當於在my兩邊加上[]
2.3 圓括號匹配
圓括號括起來的正規表示式所匹配的字串會可以當成變數來使用,sed中使用的是\1,\2…
sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' my.txt cat:betty dog:frank fish:george goat:adam
2.4 基本知識點
1)Pattern Space:關於引數-n,表示取消預設輸出,相當於--quiet,--silent。在sed處理檔案的時候,每一行都被儲存在一個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將列印在螢幕上。接著模式空間被清空,並存入新的一行等待處理。
2)Address:[address[,address]][!]{cmd},其中的!表示匹配成功後是否執行命令,address可以是一個數字,也可以是一個模式,可以透過逗號分隔兩個address表示兩個address的區間。
3)命令打包:cmd可以是多個,它們可以用分號分開,可以用大括號括起來作為巢狀命令
對3行到第6行,匹配/This/成功後,再匹配/fish/,成功後執行d命令:
sed '3,6 {/This/{/fish/d}}' pets.txt
從第一行到最後一行,如果匹配到This,則刪除之;如果前面有空格,則去除空格:
sed '1,${/This/d ; s/^ *//g}' pets.txt
4)HoldSpace:保持空間
g:將hold space中的內容複製到pattern space中,原來pattern space裡的內容清除 G:將hold space中的內容append到pattern space\n後 h:將pattern space中的內容複製到hold space中,原來的hold space裡的內容被清除 H:將pattern space中的內容append到hold space\n後 x:交換pattern space和hold space的內容
sed -e '/test/h' -e '$G‘ example:在這個例子裡,匹配test的行被找到後,將存入模式空間,h命令將其複製並存入一個稱為保持快取區的特殊緩衝區內。第二條語句的意思是,當到達最後一行後,G命令取出保持緩衝區的行,然後把它放回模式空間中,且追加到現在已經存在於模式空間中的行的末尾。在這個例子中就是追加到最後一行。簡單來說,任何包含test的行都被複制並追加到該檔案的末尾。
sed -e '/test/h' -e '/check/x' example:互換模式空間和保持緩衝區的內容。也就是把包含test與check的行互換。
5)執行sed指令碼:sed -f test.sed
Sed對於指令碼中輸入的命令非常挑剔,在命令的末尾不能有任何空白或文字,如果在一行中有多個命令,要用分號分隔。以#開頭的行為註釋行,且不能跨行。
ps: 去除空白行:sed '/^ *$/d' file
3. sort:文字內容排序
語法:
sort [-bcdfimMnr] [-o<輸出檔案>] [-t<分隔字元>] [+<起始欄位>-<結束欄位>] [--help] [--verison] [檔案]
引數:
-b 忽略每行前面開始出的空格字元。 -c 檢查檔案是否已經按照順序排序。 -d 排序時,處理英文字母、數字及空格字元外,忽略其他的字元。 -f 排序時,將小寫字母視為大寫字母。 -i 排序時,除了040至176之間的ASCII字元外,忽略其他的字元。 -m 將幾個排序好的檔案進行合併。 -M 將前面3個字母依照月份的縮寫進行排序。 -n 依照數值的大小排序。 -o<輸出檔案> 將排序後的結果存入指定的檔案。 -r 以相反的順序來排序。 -t<分隔字元> 指定排序時所用的欄位分隔字元。 +<起始欄位>-<結束欄位> 以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。 --help 顯示幫助。 --version 顯示版本資訊
4. uniq:
顯示唯一的行,對於那些連續重複的行只顯示一次,以及計數重複的行
uniq:不加任何參數列示匹配第一次出現的那行
uniq -c:顯示重複的行的行數
uniq -u:僅顯示檔案中沒有連續出現的行,唯一行
uniq -d:僅顯示檔案中連續重複出現的行。
5. cut:
片段擷取工具,可以從一個文字檔案或者文字流中提取文字列
5.1 命令用法
cut -b list [-n] [file ...] cut -c list [file ...] cut -f list [-d delim][-s][file ...]
-b、-c、-f分別表示位元組、字元、欄位(即byte、character、field);list表示-b,-c,-f操作範圍,-n表示具體數字,with -b: don’t split multibyte characters;file表示的自然是要操作的文字檔案的名稱;delim(英文全寫:delimiter)表示分隔符,預設情況下為TAB;-s表示不包括那些不含分隔符的行(這樣有利於去掉註釋和標題)。
--output-delimiter=字串,使用指定的字串作為輸出分界符,預設採用輸入的分界符。上面三種方式中,表示從指定的範圍中提取位元組(-b)、或字元(-c)、或欄位(-f)。
LIST的範圍:
N 只有第N項 N- 從第N項一直到行尾 N-M 從第N項到第M項(包括M) -M 從一行的開始到第M項(包括M) - 從一行的開始到結束的所有項
5.2 用法例項
擷取/etc/passwd檔案中的前十五個使用者名稱:
cut -f1 -d: /etc/passwd | head -15
擷取/etc/passwd檔案每一行前十個位元組的內容:
cut -b 1-10 /etc/passwd
擷取該檔案每一行第1,4,7個位元組的內容:
cut -b 1,4,7 /etc/passwd
將/etc/passwd的分隔符換成“|”輸出:
cut -d: -f 1- -s --output-delimiter=”|” /etc/passwd
6. grep:
擷取具有特定資訊的行,逐行操作。
用法:grep [-acinv] [--color=auto] '搜尋字串' filename
-a : 將binary檔案以text 檔案的方式搜尋資料 -c: 計算找到'搜尋字串'的次數 -i: 忽略大小寫的不同,所以大小寫視為相同 -n : 順便輸出行號 -v : 反向選擇,亦即顯示出沒有'搜尋字串'內容的那一行! --color=auto: 可以將找到的關鍵詞部分加上顏色的顯示!
7. wc:
統計單詞。
用法:wc [-lwmc]
-l : 僅列出行; -w : 僅列出多少字(英文單字); -m : 多少字元; -c: 多少位元組
不加任何參數列示全部列出。
例項:/etc/man.config 裡面有多少相關字、行、字元數:
cat /etc/man.config | wc
相關文章
- 流資料處理利器
- 處理圖片流資料
- 使用資料流的思想處理檔案
- 大資料爭論:批處理與流處理的C位之戰大資料
- 大資料流處理:Flume、Kafka和NiFi對比大資料KafkaNifi
- Python資料處理(二):處理 Excel 資料PythonExcel
- Streams 流處理
- 資料處理
- 亞信安慧AntDB資料庫——實時流資料處理的先鋒資料庫
- 基於 RocketMQ Connect 構建資料流轉處理平臺MQ
- LINUX系統 利用AWK命令處理文字資料過程Linux
- 使用記憶體NewSQL資料平臺來處理實時資料流的三個好處記憶體SQL
- 海量資料處理
- python 處理資料Python
- springmvc 資料處理SpringMVC
- Panda資料處理
- 資料預處理
- Excel 資料處理Excel
- javascript - 資料處理JavaScript
- java處理流 和節點流(在位元組流和字元流中,又分為處理流和節點流)Java字元
- 資料分析--資料預處理
- 資料預處理-資料清理
- 資料清洗和資料處理
- 在 React 中處理資料流問題的一些思考React
- Oracle資料庫處理壞塊問題常用命令Oracle資料庫
- 批處理命令之tree命令
- 菜鳥學習筆記:Java提升篇6(IO流2——資料型別處理流、列印流、隨機流)筆記Java資料型別隨機
- 什麼是流處理
- Python資料處理(一):處理 JSON、XML、CSV 三種格式資料PythonJSONXML
- 三種大資料流處理框架選擇比較:Apache Kafka流、Apache Spark流和Apache Flink - quora大資料框架ApacheKafkaSpark
- Linux文字處理命令Linux
- 目錄處理命令
- 請求資料處理
- 海量資料處理2
- 雨滴譜資料處理
- flutter json資料處理FlutterJSON
- 資料預處理 demo
- Hive處理Json資料HiveJSON
- 0701-資料處理