目錄
1.正則表達式
2.C中使用正則
3.復習
4.sort命令
5.uniq命令
6.wc命令
7.grep命令
8.find命令
9.xargs命令
10.sed命令
11.awk命令
12.crontab
1.正則表達式
1 管道
? ? 使用| 將多個命令拼接在一起
? ? 原理,就是將前一個命令的標準輸出作為后一個命令的標準輸入來重定向 ,標準錯誤輸出是不會重定向
? ? 需求,編寫一個簡單的管道命令,讀取標準輸入,將標準輸入的數據轉為大寫,然后輸出
? ? more 命令
? ? ? ? 將標準輸入的內容進行緩慢向下查看,要人工操作向下
? ? ? ? 只支持向下走,不支持往回走
? ? less 命令
? ? ? ? 比more更加完善,支持往回滾,也支持類似vim的操作,查找 hjkl
2.C中使用正則
2 tee 命令
? ? 將標準輸出重新輸出,同時存一份到文件
? ? 常用的場景
? ? ? ? 開一個服務,服務一直在刷log,需要實時看到log,但是又想將log存成一個文件
3.復習
3 文件重定向
? ? cmd > file ? ? ? ? ? ? ?把標準輸出重定向到新文件中
? ? cmd >> file ? ? ? ? ? ? 追加
? ? cmd > file 2>&1 ? ? ? ? 標準出錯也重定向到1所指向的file里
? ? ? ? 2>&1?
? ? ? ? ? ? 文件描述符2 也重定向到文件描述符1的位置
? ? ? ? ? ? 標準錯誤輸出也重定向到標準輸出的位置
? ? cmd >> file 2>&1
? ? cmd < file
? ? ? ? 將file的內容重定向到cmd命令的標準輸入
? ? cmd < file1 > file2 ? ? 輸入輸出都定向到文件里
? ? cmd < &fd ? ? ? ? ? ? ? 把文件描述符fd作為標準輸入
? ? cmd > &fd ? ? ? ? ? ? ? 把文件描述符fd作為標準輸出
? ? cmd < &- ? ? ? ? ? ? ? ?關閉標準輸入
4.sort命令
4 函數
? ? function 函數名() ? ? ? ?#小括號里邊也不需要填參數列表
? ? {
? ? ? ? local var=value ? #局部變量
? ? ? ? return 1 ? ? ? ? ?#return 只能返回整數,不能返回其他類型 ,返回值是作為退出狀態來使用
? ? }
? ? function關鍵字可以省略 ? ,小括號也可以省略 ,但是兩個必須要保留一個,不然解析器不知道是要定義一個函數
? ? 調用函數的方法,就跟普通命令一樣
? ? ? ? 函數名 arg1 arg2 ?...
? ? ? ? 函數的執行狀態看return語句,如果沒有return語句,就以函數里邊最后一條執行的指令的返回狀態作為整個函數的退出狀態
? ? 函數支持遞歸
? ? ? ? 遍歷目錄,包括子目錄,如果是文件就輸出xxx是文件,如果是目錄就輸出xxx是目錄
? ? 函數的傳參
? ? ? ? 也是使用 $1 $2 ... 來獲取函數內的參數
? ? #!/bin/bash
? ? function visit
? ? {
? ? ? ? local dir="$1"
? ? ? ? for f in `ls $1`
? ? ? ? do
? ? ? ? ? ? if [ -f "$dir/$f" ]
? ? ? ? ? ? then
? ? ? ? ? ? ? ? echo "$dir/$f is a file"
? ? ? ? ? ? elif [ -d "$dir/$f" ]
? ? ? ? ? ? then
? ? ? ? ? ? ? ? echo "$dir/$f is a dir"
? ? ? ? ? ? ? ? visit "$dir/$f"
? ? ? ? ? ? else
? ? ? ? ? ? ? ? echo "$dir/$f is not recognized"?
? ? ? ? ? ? fi
? ? ? ? done
? ? }
? ? visit .
? ? 腳本的調試
? ? ? ? -n ? 遍歷一下腳本,檢查語法錯誤
? ? ? ? -v ? 一遍執行腳本一遍將解析到的腳本輸出來
? ? ? ? -x ? 執行腳本的同時打印每一句命令,把變量的值都打印出來 ?(常用)
? ? ? ? 打開調試的方法
? ? ? ? ? ? 1. bash -x ?腳本.sh
? ? ? ? ? ? 2. 腳本開頭 使用 #!/bin/bash -x
? ? ? ? ? ? 3. 腳本中顯式的使用 set -x 打開 ? 使用 set +x 關閉調試
5.uniq命令
5 正則表達式
練習: ? ? ? ? ? ? ??
? ? 1 以S開頭的字符串 ? ? ?
? ? ? ? ^S
? ? 2 以數字結尾的字符串
? ? ? ? [0123456789] ? 匹配任意數字
? ? ? ? [0-9]
? ? ? ? \d
? ? ? ? $ ? ? ? ? ? ? ? 匹配字符串結尾
? ? ? ? [0-9]$
? ? 3 匹配空字符串(沒有任何字符)
? ? ? ? ^$
? ? 4 字符串只包含三個數字
? ? ? ? ^\d\d\d$
? ? ? ? ^\d{3}$
? ? ? ? ? ? {n} 花括號括起來一個數字,表示前面的單元重復n次
? ? 5 字符串只有3到5個字母
? ? ? ? 控制最少重復次數和最大的重復次數
? ? ? ? {m,n} m表示前面單元最小重復次數,n表示最大重復次數
? ? ? ? [a-zA-Z] ? 表示大小寫字母 ?如果中括號中有多個區間,區間之間不要留空格或其他分隔符
? ? ? ? ^[a-zA-Z]{3,5}$
? ? 6 匹配不是a-z的任意字符
? ? ? ? [^a-z] ? ?中括號中第一個字符如果是^,表示區間取反
? ? ? ? ^[^a-z]$
? ? 7 字符串有0到1個數字或者字母或者下劃線
? ? ? ? {0,1} 表示重復0-1次
? ? ? ? ? ? ? 也可以表示0-1次重復
? ? ? ? ^[0-9a-zA-Z_]?$
? ? ? ? ^\w?$
? ? 8 字符串有1個或多個空白符號(\t\n\r等)
? ? ? ? \s ?表示空白字符 包括 \t\n\r ....
? ? ? ? {1,} ? 表示重復1-n ?跟+號一樣
? ? ? ? ^\s+$
? ? 9 字符串有0個或者若干個任意字符(除了\n)
? ? ? ? . ?代表任意字符,除了\n
? ? ? ? ^.{,}$ ? 花括號中兩個參數置空表示重復次數任意 0-n
? ? ? ? ^.*$ ? ? *表示前面的單元重復0-n次
? ? ? ? ? 0-1
? ? ? ? + 1-n
? ? ? ? * 0-n
? ? 10 匹配0或任意多組ABC,比如ABC,ABCABCABC
? ? ? ? 使用小括號來講多個單元重新組合成為一個單元
? ? ? ? ^(ABC)*$
? ? 11 字符串要么是ABC,要么是123
? ? ? ? | 表示選擇,選擇兩邊的正則匹配一個
? ? ? ? ^ABC$|^123$
? ? ? ? ^(ABC|123)$ ? ? 小括號也可以將選擇范圍控制在括號內
? ? 12 字符串只有一個點號 ?
? ? ? ? 做轉義 還是使用\
? ? ? ? ^\.$
? ? 13 匹配十進制3位整數 ? ? ? ? ? ??
? ? ? ? 100 - 999
? ? ? ? ^[1-9][0-9]{2}$
? ? ? ? 匹配十進制 0-999 的數字
? ? ? ? ? ? 分段
? ? ? ? ? ? ? ? 一位數
? ? ? ? ? ? ? ? ? ? [0-9]
? ? ? ? ? ? ? ? 兩位數
? ? ? ? ? ? ? ? ? ? 10-99
? ? ? ? ? ? ? ? ? ? [1-9][0-9]
? ? ? ? ? ? ? ? 三位數
? ? ? ? ? ? ? ? ? ? [1-9][0-9]{2}
? ? ? ? ? ? ^([0-9]|[1-9][0-9]{1,2})$
? ? 14 匹配0-255的整數
? ? ? ? 匹配 ip?
? ? ? ? ? ? 分段
? ? ? ? ? ? ? ? 一位數
? ? ? ? ? ? ? ? ? ? [0-9]
? ? ? ? ? ? ? ? 兩位數
? ? ? ? ? ? ? ? ? ? 10-99
? ? ? ? ? ? ? ? ? ? [1-9][0-9]
? ? ? ? ? ? ? ? 三位數
? ? ? ? ? ? ? ? ? ? 100-199
? ? ? ? ? ? ? ? ? ? ? ? 1[0-9]{2}
? ? ? ? ? ? ? ? ? ? 200-249
? ? ? ? ? ? ? ? ? ? ? ? 2[0-4][0-9]
? ? ? ? ? ? ? ? ? ? 250-255
? ? ? ? ? ? ? ? ? ? ? ? 25[0-5]
? ? 15 匹配端口號
? ? ? ? 0-65535
? ? 16 email
? ? ? ? [\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
? ? 基礎的正則
? ? ? ? +?* 是普通字符
? ? 擴展的正則
? ? ? ? +?* 是特殊字符
? ? perl的正則
? ? ? ? 最常用
? ? ? ? perl正則在擴展正則之上添加了一些特殊符號
? ? ? ? ? ? \d \w \s ....
6.wc命令
6 sort
? ? 命令從標準輸入中讀取數據然后按照字符串內容進行排序
? ? -f 忽略字符大小寫
? ? -n 比較數值大小
? ? -t 指定分割符,默認是空格或者tab
? ? -k 指定分割后進行比較字段
? ? -u 重復的行只顯示一次
? ? -r 反向排序
? ? -R 打亂順序
? ? ? ? 同樣的兩行洗不亂
? ? ? ? 將/etc/passwd 根據用戶id來排序
? ? ? ? sort -t: -k3 -n < /etc/passwd
7.grep命令
7 uniq
? ? 去除重復的行,前提是重復的行連續
? ? -c 顯示每行重復的次數
? ? -d 僅顯示重復過的行
? ? -u 僅顯示不曾重復的行
? ? ? ? sort < test.txt | uniq
8.find命令
9 grep
? ? global regular expression print
? ? -c 只輸出匹配行的計數
? ? -i 不區分大小寫
? ? -H 文件名顯示
? ? -r 遞歸遍歷目錄
? ? -n 顯示行號
? ? -s 不顯示不存在或無匹配文本的錯誤信息
? ? -v 顯示不包含匹配文本的所有行,這個參數經常用于過濾不想顯示的行
? ? -E 使用擴展的正則表達
? ? -P 使用perl的正則表達式
? ? -F 匹配固定的字符串,而非正則表達式
? ? egrep ?= grep -E
? ? fgrep ?= grep -F
? ? rgrep ?= grep -r
? ? grep 默認使用的是基礎的正則
9.xargs命令
10 find
? ? find pathname -options [-print -exec -ok ...]
? ? option 選項如下:
? ? ? ? -name 按照文件名查找文件。
? ? ? ? ? ? find . -name "1.txt"
? ? ? ? -perm 按照文件權限來查找文件。
? ? ? ? ? ? find . -perm 660
? ? ? ? -user 按照文件屬主來查找文件。
? ? ? ? -group 按照文件所屬的組來查找文件。
? ? ? ? -mtime -n +n 按照文件的更改時間來查找文件,-n表示文件更改時間距現在n天以內,+n表示文件更改時間距現在
? ? ? ? ? ? n天以前。find命令還有-atime和-ctime 選項,但它們都和-m time選項。
? ? ? ? -atime 訪問時間
? ? ? ? -ctime 創建時間
? ? ? ? -nogroup 查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。
? ? ? ? -nouser 查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。
? ? ? ? -newer file1 ! file2 查找更改時間比文件file1新但比文件file2舊的文件。
? ? ? ? -type 查找某一類型的文件,諸如:
? ? ? ? ? ? b - 塊設備文件。
? ? ? ? ? ? d - 目錄。
? ? ? ? ? ? c - 字符設備文件。
? ? ? ? ? ? p - 管道文件。
? ? ? ? ? ? l - 符號鏈接文件。
? ? ? ? ? ? f - 普通文件。
? ? ? ? ? ? s - socket文件
? ? ? ? -exec
? ? ? ? ? ? find . -name "*.txt" -exec gzip {} \;
? ? ? ? ? ? 查找當前目錄下的txt文件并且打包成為gzip
? ? ? ? ? ? 每找到一個文件,就會執行exec后面的命令
? ? ? ? ? ? ? ? gzip ./a/2.txt
? ? ? ? ? ? ? ? gzip ./a/6.txt
? ? ? ? ? ? ? ? 最后是一個\; ?反斜杠不能省,作為當前exec后面命令的結束符
? ? ? ? -ok?
? ? ? ? ? ? 跟-exec用法一樣,但是每找到一個文件要執行后面的命令前會給用戶確認
10.sed命令
11 xargs
? ??
? ? 將標準輸入的參數整齊的拼湊在一行里邊
? ? 單獨使用該命令沒什么用,要配合其他命令來使用
? ? docker ps -aq | xargs docker rm -f
? ? find . -name "*.txt" | xargs -I{} mv {} ?xxx/
? ? ? ? -I{} 指定一個替換字符串作為參數替換
? ??
11.awk命令
12 sed
? ? 文本1 -> ?sed + 腳本 -> 文本2?
? ? ed 編輯器 ? -> ?sed ? -> vim?
? ? sed option 'script' file1 file2 ... ? ? ? ? ? ? sed 參數 ?‘腳本(/pattern/action)’ 待處理文件
? ? sed option -f scriptfile file1 file2 ... ? ? ? ?sed 參數 –f ‘腳本文件’ 待處理文件
? ? ? ? p, ?print ? ? ? ? ? 打印
? ? ? ? a, ?append ? ? ? ? ?追加
? ? ? ? i, ?insert ? ? ? ? ?插入
? ? ? ? d, ?delete ? ? ? ? ?刪除
? ? ? ? s, ?substitution ? ?替換
12.crontab
13 awk
? ? awk option 'script' file1 file2 ...
? ? awk option -f scriptfile file1 file2 ...
? ? 最常見用法就是過濾哪一列
? ? xxxx | awk '{print $2}'
? ? 腳本格式
? ? {actions} ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? 每一行文本都無條件的執行腳本
? ? /pattern/{actions}
? ? ? ? 匹配了模式之后再執行后面的動作
? ? condition{actions}
? ? ? ? BEGIN
? ? ? ? ? ? 在遍歷文本的第一行之前會執行某個動作
? ? ? ? END
? ? ? ? ? ? 在遍歷完文本之后再去執行某個動作
? ? ProductA 30
? ? ProductB 76
? ? ProductC 55
? ? 在輸出表格之前輸出表頭 ?產品名字 ?庫存
? ? 輸出完表格之后 ?輸出 ? ?庫存總量 : xxxx
? ? 在遍歷之前輸出表頭
? ? BEGIN{
? ? ? ? printf "%s\t%s\n","產品","庫存";
? ? ? ? sum=0;
? ? }
? ? 在遍歷每一行的過程中輸出每一行的內容,將庫存加到sum變量
? ? {
? ? ? ? printf "%s\t%s\n",$1,$2;
? ? ? ? sum+=$2;
? ? }
? ? 遍歷完之后輸出sum變量
? ? END{
? ? ? ? printf "庫存總量:%d\n",sum
? ? }