文本處理工具
grep 文本搜索工具,根據用戶指定的“模式” 對目標文本逐行進行匹配檢查,打印匹配到的行.
-o 僅顯示匹配到的字符串
-v 顯示不被模式匹配到的行
-n 顯示匹配的行數
-c 統計匹配的行數
-i 忽略字符大小寫
-q 靜默模式,不輸出任何信息
-A# 后#行
-B# 前#行
-C# 前后各#行
-e 實現多個選項間的邏輯or關系 grep -e ‘cat’ -e ‘dog’
-w 匹配整個單詞
-E 使用ERE
-F 相當于fgrep,不支持正則表達式
正則表達式: 由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能.
兩類: 基本正則表達式 ; 擴展正則表達式 (grep -e ; egrep)
元字符分類: 字符匹配,匹配次數,位置錨定,分組
基本正則表達式元字符:
\. 轉義 “.\..” \. 就是.的意思
. 任意的單個字符 (在括號里就是 .)
[] 匹配指定范圍內的任意單個字符
[^] 匹配指定范圍外的任意單個字符
匹配次數: 用在要指定次數字符后面,指定前面字符要出現的次數
.* 任意長度的任意字符
* 匹配前面字符任意次 包括0次
\? 匹配前面字符的0或1次
\+ 匹配前面字符1次或n次
\{n\} 匹配前面字符n次
\{n,\}匹配前面字符最少n次
\{,n\}匹配前面字符最多n次
\{m,n\} 匹配前面字符出現m-n次
如: grep “go\{10\}gle” / o出現十次
go\?gle
“[a-z]\+” a-z 任意一個出現一次或多次
{1,5\} 1-5 個字符
位置錨定: 定位出現的位置
^ 行首錨定,用于模式的行首 “^zhang”
$ 行尾錨定,用于模式的行尾 “zhang$”
^pattren$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行 (空格 Tab)
\<或\b 詞首錨定,用于單詞模式的行首 \>或\b 詞尾錨定,用于單詞模式的行尾
\<pattern\> 匹配整個單詞
分組 : \(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理.
如: \(root\)\+
分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為:\1,\2,\3…
\1 表示從行首起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
如: \(zhang1\+\(zhang2\)*\) \1 : zhang1\+\(zhang2\)* \2 : zhang2
后向引用:引用前面的分括號中的模式所匹配字符,而非模式本身
或者:\| a\|b a或b \(C\|c\)at Cat或cat
egrep及擴展正則表達式
egrep = grep -E
字符匹配:
. 任意單個字符
.* 任意長度的任意字符
[] 指定范圍的字符
[^] 不在指定范圍的字符
* 匹配前面的字符任意次
? 0或1次(最多一次)
+ 1次或多次(最少一次)
\{m} 匹配m次
\{m,n} 匹配m-n次
位置錨定:
^ :行首 $ :行尾 \<, \b :語首 \>, \b :語尾 ?
分組:
() 后向引用:\1, \2, … ?
或者:
‘a|b’: a或b ‘C|cat’: C或cat ‘(C|c)at’:Cat或cat
0-9[0-9] 10-99[1-9][0-9] 100-199=1[0-9][0-9] 200-249=2[0-4][0-9] 250-255=25[0-5]
vim 文本編輯器
行編輯器 sed 全屏編輯器 nano vim
三種主要模式:
?命令(Normal)模式: 默認模式,移動光標,剪切/粘貼文本
?插入(Insert)或編輯模式: 修改文本 ?
擴展命令(extended command )模式: 保存,退出等
i–編輯模式
:–擴展模式
v–編輯模式
Esc 退出當前模式, 總是返回到命令模式
vim +/ 打開文件
-b 二進制方式打開文件
-d 比較多個文件
-m 只讀打開文件
-e 直接進入ex模式
命令模式:
i 在光標處輸入
I 在當前光標行首輸入
x 刪除光標處的字符
~ 轉化大小寫
r 替換光標所在處的字符
dd 刪除整行
y 復制
Y 復制整行
p 粘貼
擴展模式:
:q 退出
:q! 強制退出不做修改
:wq 保存退出 / / 保存到新建文件下
:x 保存退出
Shell 腳本編程基礎
程序:指令+數據
程序編程風格: 過程式:以指令為中心,數據服務于指令
對象式:以數據為中心,指令服務于數據
格式要求:首行shebang機制: #/bin/bash
創建shell腳本
1.使用文本編輯器創建文本文件
第一行必須有shell聲明序列:
#/bin/bash
添加注釋: 以#開頭
2.運行腳本
給予執行權限,在命令行上指定腳本的絕對或相對路徑
直接運行解釋器,將腳本作為解釋器程序的參數運行
(.)source 使腳本是在當前shell進行
. /etc/profile.d/env.sh 改完文本文件腳本用 . 可立即生效
bash -x /.sh 顯示腳本過程
bash -n /.sh 檢測腳本錯誤語法
變量:變量命名法則:不能使程序中的保留字:如if,for
只能使用數字,字母下劃線,且不能以數字開頭。
見名知義。
統一命名規則:駝峰命名法
bash中的變量種類:
局部變量:生效范圍為當前shell進程;對當前shell之外的其他shell進程,包括當前shell的子shell進程均無效。
環境(全局)變量:生效范圍為當前shell進程及其子進程
本地變量:生效范圍為當前shell進程中某代碼片段,通常指函數
位置變量:$1,$2,……來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
特殊變量:$?,$0,$*,$@,$#,$$
局部變量: 變量賦值:name= ‘VALUE’ (值)
可以使用引用VALUE:
1,可以是直接字符串;name= “root”
2,變量引用:name= “$USER”
3,命令引用:name=`Command` name=$(Command)
變量引用:${name} $name
“”:弱引用,其中的變量引用會被替換為變量值
”:強引用,其中的變量引用不會被替換為變量值,而保持元字符串
顯示已定義的所有變量:set
刪除變量:unset name
全局變量:
變量聲明,賦值:
export name=VALUE
declare -x name=VALUE
變量引用:$name,${name}
顯示所有環境變量: env printenv export declare -x
刪除變量: unset name
bash內建的環境變量:PATH SHELL USER UID HOME PWD SHLVL LANG MAIL HOSTNAME HISTSIZE –
只讀變量:只能聲明,但不能修改和刪除
聲明只讀變量:readonly name declare -r name
查看只讀變量:readonly -p
位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數
$1, $2, …:對應第1、第2等參數,shift [n]換位置
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
set– 清空所有位置變量
bash退出狀態 0成功 1-255失敗
腳本中一但遇到 exit 腳本會立即終止;終止退出狀態取決于exit后面的數字。
bash中的算術運算:let + – * % /
增強型賦值:+= -= *= %= /=
a=$1
b=$2
let c=a+b
echo $c
bash有內建的隨機數生成器:$RANDOM(0-32767) echo $[$RANDOM%50] :0-49之間隨機數
bash的數值測試
? -v VAR 變量VAR是否設置 ?
數值測試: -gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
添加變量: name=”zhang” 顯示變量: echo $name
name=`hostname` 顯示變量: echo $name
name=`/date/wenjian` 顯示變量 :echo $”name”
i=100 :echo $i
zhang=abcc :echo $zhang
unset name 刪除變量
(name=zhang;echo $name)加()表示一次性,不改變變量
不影響當下得shell環境
{ name=zhang;echo $name } 加{}改變變量,同時執行
export name 把name改變成全局變量
編輯腳本。
#!/bin/bash
#
#*******************************************************
#Author: chongyang.zhang
#QQ: 285930443
#Date: 2018-04-09
#FileName: 91_scp.sh
#URL: http://www.magedu.com
#Description: The test script
#Copyright (C): 2018 All rights reserved
#*******************************************************
#
echo “Start copy…”
scp $* wang@172.20.102.77:/home/wang/bin
echo “Copy finished”
腳本內容:復制91_scp.sh文件,到ip172.20.102.77的/home/wang/bin下得目錄
#: ./91_scp.sh 91_scp.sh
(執行91_scp.sh程序,復制91_scp.sh文件)
scp 遠程復制
scp 文件 用戶名@IP:目錄
scp /data/z root@172.20.109.27:/data/
COLOR=$[RANDOM%7+31] ; echo -e “\e[1;${COLOR}mcolor\e[0m”
echo $COLOR(輸入變量) color隨機變色
腳本中添加顏色:
echo -e “\e[1;31m變量\e[0m”
例:[ $c -le 1000 ] && echo -e “\e[1;33mhaha\e[0m” || echo -e “\e[1;34mxixi\e[0m”
邏輯運算:
& 并且 and | 或者 or
cmd1 && cmd2 如果cmd1為假,cmd2不執行;反之cmd1為真,cmd2執行。
cmd1 || cmd2 如果cmd1為假,cmd2執行;反之cmd1為真,cmd2不執行。
cmd1 && echo aaa || echo bbb cmd1為真,顯示aaa
cmd1為假,顯示bbb
磁盤空間超過80報警腳本:
DF=`df | |tr -s ‘ ‘|tr ‘ ‘ ‘%’|cut -d’%’ -f5|sort -n|tail -n1`
[ $DF -ge 80 ] && `wall “disk will be full”` || `wall “perfect”`
(DF超過80,顯示disk…… ;不超,顯示perfect)
腳本中顯示用 `wall “perfect……”`
(wall用于向系統當前所有打開終端上輸出信息,顯示時間。。)
用echo可以顯示,不需要 ` “”
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96963