檢查服務是否啟動
lsof -i:8080
netstat -lntup |grep 8080
ss -lntup |grep 8080
ps -ef |grep 8080
grep
過濾文字
-A 之前x行(不包括搜尋的行)
-B 之後x行(不包括搜尋的行)
-C 前後x行(不包括搜尋的行)
-c 有幾行,類似 wc -l 的功能
-i 忽略大小寫
-w word,單字匹配
-v 回傳相反的匹配
grep -A3 5 fileName:找到 5 後,將前3行顯示出來,所以總共會顯示 4 行
seq 10 |grep -A3 5 ==> 5~8
seq 10 |grep -B3 5 ==> 2~5
seq 10 |grep -C3 5 ==> 2~8
seq 20 |grep 5 |wc -l
seq 20 |grep -c 5
grep -i a test.txt
seq 50 |grep 5
seq 50 |grep -w 5
seq 20 |grep -v 5
sed
針對行的增刪改查,stream edit 的縮寫
-n:sed 會一行一行執行,預設每行都會輸出,所以匹配到的會出現兩次,而加這個只會將匹配成功的輸出
-i:顯示的結果,預設不會覆蓋原檔案,如果要覆蓋要加這個參數
-r -E:加上正則表達式支援
增刪改查
c a i:replace想成 ce的c/append/insert
d:delete
s:substitute
p:print
p:
'3p' 印出第3行
'1,5p' 印出1~5行
'/xxx/p' 找 xxx
'/10:00/,/11:00/p' 找 10:00~11:00 之間的資料
增刪改查範例:
sed -n '/7/,/10/p' test.txt
sed '/7/,/10/d' test.txt // 加 -n 會看不到結果,每次的7~10都會刪除
sed 's/a/aaa/' test.txt // s寫在前面,s/a/aaa/、s#a#aaa#,分隔符不要太奇怪都可以
sed 's#[0-9]##g' test.txt // 將數字取代成空,但仍然有換行,最後不加 g,只會取代每行的第一個數字
sed '6a xxxxxx' test.txt // 在第6行之後加一行 xxxxxx
sed '6i xxxxxx' test.txt // 在第6行之前加一行 xxxxxx
sed '6c xxxxxx' test.txt // 取代第6行,變成 xxxxxx
awk
發明人的名字第一個字母組成的
record:行(左右),預設 \n,-v RS 可改
field:列(上下),預設空隔,-F 或 -v FS 可改
$數字:第x列,$0是整行
NF:最後一列的數字,可以加減,但要用圓括號包起來
NR:行號
-F分隔符
FS:-v FS=分隔符,給 awk 的分隔符,相當於 -F,預設是空格
OFS:-v OFS=分隔符,awk 返回結果的分隔符,預設是空格
RS:-v RS=換行符,預設 \n
ORS:-v ORS=換行符,預設 \n
print 會換行
printf 不會換行
NR
Number of Record
NR==1 取出第一行
NR >=1 && NR <= 5 取出 1~5 行,還有 == != 可用
awk 'NR >= 12 && NR <= 15' test.txt
假設有一行 1,2,3,4,5,6,7,8,9,10
awk -F, 'NR==1{print $NF}' test.txt // 取第一行,然後以,分隔,再取最後一列,所以是10
awk -F, 'NR==1{print $(NF-1)}' test.txt // 取到數第二列
ls -l |awk '{print $5, $NF}' |column -t // 取第五列和最後一列,並排版
ls -l |awk '{for(i=5;i<=NF;i++){printf $i" "};printf "\n"}' |column -t // 取第五列到最後一列
正則
awk '$10~/^1/{print $10}' fileName // 第 10 個欄位是 1 開頭就印出來
~ 包含
!~ 不包含
^$ 空
//,//
//,//{print $2}
BEGIN、END
BEGIN{} 內容在 awk 讀檔案之前執行
END{} 內容在 awk 讀檔案之後執行
seq 100 |awk 'BEGIN {pring 0} {sum=sum+$1; print sum} END{print "finish"}'
印出 0~100 相加的過程,BEGIN 和 END 可以只用一個
陣列
非數字要用字串包起來
awk 'BEGIN{x[0]=123; x[1]="xxx"; print x[0], x[1]}'
awk 'BEGIN{x[0]=123; x[1]="xxx"; for(i in x) print x[i]}'