Linux三剑客与管道及正则
linux常用工具:
? ? ? ? 1.正則:正則表達式是記錄文本規則的代碼。??在線正則表達式測試
? ? ? ? 2.管道符“|”,用于連接兩個命令間的輸出與輸入,管道符“|”左邊的命令的輸出會作為管道符“|”右邊命令的輸入。
? ? ? ? ?echo "hello world" | grep hello
? ? ? ? 3.grep,sed,awk為三劍客,對文本進行處理。
? ? ? ? ? ? ? ? 1).grep? 根據用戶指定的模式(pattern)對目標文本進行過濾,顯示被匹配到的行。
? ? ? ? ? ? ? ? ? ? ? ? -v? 顯示不被pattern匹配的行---》grep -nv root test.txt:文件中不包含root的行數
? ? ? ? ? ? ? ? ? ? ? ? -i? 忽略字符大小寫
? ? ? ? ? ? ? ? ? ? ? ? -n? 顯示匹配的行號------》grep -n root test.txt:查找文件中包含root的行數
? ? ? ? ? ? ? ? ? ? ? ? -c? 統計匹配的行數
? ? ? ? ? ? ? ? ? ? ? ? -r 遞歸搜索
? ? ? ? ? ? ? ? ? ? ? ? -o? 僅顯示匹配到的字符串
? ? ? ? ? ? ? ? ? ? ? ? -E? 使用grep -E,相當于egrep,在使用正則匹配時用到此參數:grep -E "w{3}" test.sh
? ? ? ? ? ? ? ? ? ? ? ? 查找以R開始,以\結尾的行
? ? ? ? ? ? 判斷當前用戶在文件中是否存在,存在就打印exist,不存在打印 not exist
? ? ? /dev/null? :linux中的垃圾箱位置? ? ? ? ? ? ?
????????將未報錯的輸出扔進垃圾箱:>> /dev/null
? ? ? ? ?不管報錯與否都扔進垃圾箱:&> /dev/null
? ? ? ? ? ? ? ? 2).sed? ?流編輯器,對文件逐行處理
? ? ? ? ? ? ? ? 2種形式:? ? ? ? sed opcf
? ? ? ? ? ? ? ? ? ? ? ?1. sed [OPTION] “pattern command" file
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如:?sed -n "2 p" passwd
? ? ? ? ? ? ? ? ? ? ? ? OPTION:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -n? ? ? ? 只打印模式匹配的行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -f? ? ? ? 加載存放“動作”的文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -r? ? ? ? 支持拓展正則
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -i? ? ? ? 直接修改文件(真正修改生效的)
? ? ? ? ? ? ? ? ? ? ? ? pattern:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5? ? ? ? 只處理第5行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5,10? ? ? ? 只處理第5行到第10行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /parttern/? ? ?只處理能匹配pattern的行
????????????????????????????????/parttern1/,/pattern2/? ? ?只處理能匹配pattern1行到pattern2行的行
? ? ? ? ? ? ? ? ? ? ? ? command(增刪改查):? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? 新增
????????????????????????????????a? ?在匹配行后新增? ? sed -n?'4a i love you'? passwd
????????????????????????????????????????????????????????????????????????在第四行后面新增一行i love you;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? i? ? 在匹配行前新增? ?sed -n?'4i I?love you'? passwd?
????????????????????????????????????????????????????????????????????????在第四行前面插入一行I love you;?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? r? ?外部文件讀入,行后新增
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? w??匹配行寫入外部文件
? ? ? ? ? ? ? ? ? ? ? ? 刪除
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? d???sed -n?'2,5d'? passwd? 將第2~5行刪除;
? ? ? ? ? ? ? ? ? ? ? ? 修改
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? c? ?整行替換??sed -n?'2,5c i love you'? ?將第2至第5行的數據以i love you替換;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s??詞替換??sed -n?'s/old_word/new_word/g'? ?passwd?
????????????????????????????????????????????????????????????????????????將全局的old_word替換為new_word.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sed -n?'s/old/new/'? ? ? ? 只修改匹配行中第一個old為new
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sed? -n?'s/old/new/ig.? ?忽略大小寫全部替換
? ? ? ? ? ? ? ? ? ? ? ? 查詢
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p??打印? ? sed -n '/root/ p' passwd
? ? ? ? ? ? ? ? ? ? ? ? 示例:
? ? ? ?sed -n "2 p" passwd:對匹配的行做打印操作
? ? ? ?匹配含有daemon的行: sed -n "/daemon/? p" passwd? ---->/xxxword/ 單詞用//包裹
? ? ? ?匹配打印mail開頭到ntp開頭的行:sed -n "/^mail/,/^ntp/ p" passwd?
? ? ? ? ? ? ? ? ? ? ? ?2. some command | sed?sed [OPTION] “pattern command" file
? ? ? ? ? ? ? ? ? ? ? ? sed -h? 幫助文檔? ?向下翻:j
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 向上翻:k
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 下一個關鍵字:n
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 上一個關鍵字:N
? ? ? ? ? ? ? ? ? ? ? ? sed -i?'s/old_word/new_word/g' test.txt? 以修改文件內容的形式將
????????????????????????????????????????????????????????文件內全局的old_word替換為new_word.
? ? ? ? ? ? ? ? ? ? ? ? a:新增? ? sed -e '4a i love you'? 在第四行后面新增一行i love you;
? ? ? ? ? ? ? ? ? ? ? ? c.取代? ? sed -e '2,5c i love you'? ?將第2至第5行的數據以i love you替換;
? ? ? ? ? ? ? ? ? ? ? ? d.刪除? ? sed -e '2,5d'? ? 將第2~5行刪除;
? ? ? ? ? ? ? ? ? ? ? ? i:插入修改? ? ?sed -e '4i I?love you'? ?在第四行前面插入一行I love you;?
? ? ? ? ? ? ? ? ? ? ? ? p:打印? ? sed -n '/root/p'
? ? ? ? ? ? ? ? ? ? ? ? s:取代? ? ?sed -e 's/old_word/new_word/g'? ?將全局的old_word替換為new_word.
? ? ? ? ? ? ? ? 3).awk :文本處理工具,處理數據并生成結果報告,對列進行處理。
????????????????把文件逐行讀入,以空格為默認分隔符將每行切片,切開的部分再進行后續處理
? ? ? ? ? ? ? ? 2種形式: awk opcf
? ? ? ? ? ? ? ? ? ? ? ? awk 'BEGIN{} pattern{commands} END{}'?file
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 包裹pattern的必須是單引號‘ ’
? ? ? ? ? ? ? ? ? ? ? ? some command | grep [option] [pattern]
? ? ? ? ? ? ? ? awk 'pattern {action}' test.txt
? ? ? ? ? ? ? ? ? ? ? ? pattern? 正則表達式
? ? ? ? ? ? ? ? ? ? ? ? action? ?對匹配到的內容需要執行的命令(默認為輸出每行內容)
? ? ? ? ? ? ? ? ? ? ? ? test.txt? ?awk瀏覽的文件名
? ? ? ? ? ? ? ? ? ? ? ? BEGIN? 處理文本前要執行的操作
? ? ? ? ? ? ? ? ? ? ? ? END? ? 處理文本后要執行的操作
? ? ? ? ? ? ? ? 內置變量:
????????????????????????$0? ??????????????????????????????????????????????整行內容
? ? ? ? ? ? ? ? ? ? ? ? ?$1~$n? ?????????????????????????????????????當前行的第1~n個字段
????????????????????????NF(Number Field)? ????????????????????當前行字段數
????????????????????????NR(Number Row)? ? ? ? ? ? ? ? ? ? ? ?當前行行號,從1開始
? ? ? ? ? ? ? ? ? ? ? ? FS(Field Separator) /-F? ? ? ? ? ? ? 輸入字段分割符,默認為空格/tab鍵
? ? ? ? ? ? ? ? ? ? ? ? RS(Row Separator)? ? ????????????????輸入行分割符,默認為回車符
? ? ? ? ? ? ? ? ? ? ? ? OFS(Output Field Separator).? ?輸出字段分割符,默認為空格
? ? ? ? ? ? ? ? ? ? ? ? ORS(Output Field Separator).? ?輸出行分割符,默認為回車符? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? awk -F: '/root/ {print $7}' /etc/passwd
? ? ? ? ? ? ? ? ? ? ? ? 1.awk 按行處理/etc/passwd文件中的每行數據;
? ? ? ? ? ? ? ? ? ? ? ? 2.將讀取出的每行數據按“:”分割成域;
? ? ? ? ? ? ? ? ? ? ? ? 3.將每行經分割后的所有數據匹配正則/root/,匹配包含root的行;
? ? ? ? ? ? ? ? ? ? ? ? 4.將匹配到的行執行print $7操作,即打印第7域(列),得出最后數據。
? ? ? ? ? ? ?awk -F: 'NR==2{print $0}' /etc/passwd
? ? ? ? ? ? ? ? ? ? ? ? 1.awk 按行讀取passwd文件中所有數據;
? ? ? ? ? ? ? ? ? ? ? ? 2.讀取的數據按“:”分割為域;
? ? ? ? ? ? ? ? ? ? ? ? 3.匹配NR==2,第二行數據,并打印整行所有數據print $0.
awk -F: 'BEGIN{print "i love you"} {print $6,$7} END{print "do you love me?"}' ?/etc/passwd
????????????????????????BEGIN? 處理文本前要執行的操作
????????????????????????END? ? 處理文本后要執行的操作
根據pid查看某進程所占用內存%MEM百分比?
awk 操作passwd文件:
?$0? ?整行內容
awk 查看文件內容?awk '{print $0}' passwd
?$1~$n? ? ?當前行的第1~n個字段
NF(Number Field)? 當前行字段數
NR(Number Row)? ? ?當前行行號,從1開始
FS(Field Separator)? ?輸入字段分割符,默認為空格/tab鍵
????????????????利用NF取出最后一列數據
?????????????????打印第1個字段和最后一個字段
????????????????RS(Row Separator)? ? 輸入行分割符,默認為回車符
????????????????OFS(Output Field Separator).? ?輸出字段分割符,默認為空格
????????????????ORS(Output Field Separator).? ?輸出行分割符,默認為回車符
格式化輸出:printf 會將空格和回車鍵都去除
? ? ? ? 格式符:? ? ? ? ? ? ? ? 含義
? ? ? ? ? ? ? ? %s? ? ? ? ? ? ? ?字符串
? ? ? ? ? ? ? ? %d? ? ? ? ? ? ? ?十進制數字
? ? ? ? ? ? ? ? %f? ? ? ? ? ? ? ? 浮點數
? ? ? ? 修飾符? ? ? ? ? ? ? ? ? 含義
? ? ? ? ? ? ? ? +? ? ? ? ? ? ? ? ?右對齊
? ? ? ? ? ? ? ? -? ? ? ? ? ? ? ? ?左對齊
?格式化:\n換行
? ? ? ? ? ? ? ? /t 指標符
? ? ? ? ? ? ? ? ?%40s 占40個字符,默認右對齊,未占用的用空格代替
? ? ? ? ? ? ? ? ?左對齊????????
?打印包含“chuntian"的行的第1列和最后1列數據
打印mail 到 games的行
需求:取出第6列中含bin的行?
使用正則匹配包含/bin的行
?使用正則匹配第6列包含/bin的行
匹配行后打印總共有幾行
AWK 語法:
????????將awk命令寫入文件,通過文件載入命令
????????vim test.awk. 建議按照此格式寫,不然可能報錯。
BEGIN{FS=":"printf "%-20s\t%-20s\n","User","Status" }{if ($6 ~ "bin"){count++printf "%-20s\t%-20s\n",$1,$NF} }END{printf "%-20s\t%-20s\n","Total:",count }效果:
通過awk -f 參數加載命令文件。?
awk 語法2:
? ? ? ? 統計每個用戶的 數量
BEGIN{FS=":"printf "%-20s\t%-20s\n","User","Total" }{USER[$1] += 1 }END{for (u in USER)printf "%-20s\t%-20s\n",u,USER[u] }效果:
?統計日志中每位用戶成功數和失敗數
BEGIN{FS=":"printf "%-20s\t%-20s\t%-20s\n","User","Success","Fail" }{if ($5 == "pass"){SUCCESS[$4] += 1} else{FAIL[$4] += 1}USER[$1] += 1 }END{for (u in USER){ALL_SUCCESS += SUCCESS[u]ALL_FAIL += FAIL[u]printf "%-20s\t%-20s\t%-20s\n",u,SUCCESS[u],FAIL[u]}printf "%-20s\t%-20s\t%-20s\n","Total",ALL_SUCCESS],ALL_FAIL }?效果:
總結
以上是生活随笔為你收集整理的Linux三剑客与管道及正则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java内存溢出场景及解决办法
- 下一篇: TJU Problem 2520 Qui