grep{
-c # 顯示匹配到得行的數目,不顯示內容
-h # 不顯示文件名
-i # 忽略大小寫
-l # 只列出匹配行所在文件的文件名
-n # 在每一行中加上相對行號
-s # 無聲操作只顯示報錯,檢查退出狀態
-v # 反向查找
-e # 使用正則表達式
-w # 精確匹配
-wc # 精確匹配次數
-o # 查詢所有匹配字段
-P # 使用perl正則表達式
-A3 # 打印匹配行和下三行
-B3 # 打印匹配行和上三行
-C3 # 打印匹配行和上下三行
grep -v "a" txt # 過濾關鍵字符行
grep -w 'a>' txt # 精確匹配字符串
grep -i "a" txt # 大小寫敏感
grep "a[bB]" txt # 同時匹配大小寫
grep '[0-9]{3}' txt # 查找0-9重復三次的所在行
grep -E "word1|word2|word3" file # 任意條件匹配
grep word1 file | grep word2 |grep word3 # 同時匹配三個
echo quan@163.com |grep -Po '(?<=@.).*(?=.$)' # 零寬斷言截取字符串 # 63.co
echo "I'm singing while you're dancing" |grep -Po 'bw+(?=ingb)' # 零寬斷言匹配
echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' |grep -Po '(?<=:).*?(?=d)' # 取出d前面數字 # ?為最小匹配
echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' | grep -Po '[-0-9.]+' # 取出d前面數字 # ?為最小匹配
echo '["mem",ok],["hardware",false],["filesystem",false]' |grep -Po '[^"]+(?=",false)' # 取出false前面的字母
echo '["mem",ok],["hardware",false],["filesystem",false]' |grep -Po 'w+",false'|grep -Po '^w+' # 取出false前面的字母
grep用于if判斷{
if echo abc | grep "a" > /dev/null 2>&1
then
echo "abc"
else
echo "null"
fi
}
}
awk{
# 默認是執行打印全部 print $0
# 1為真 打印$0
# 0為假 不打印
-F # 改變FS值(分隔符)
~ # 域匹配
== # 變量匹配
!~ # 匹配不包含
= # 賦值
!= # 不等于
+= # 疊加
b # 退格
f # 換頁
n # 換行
r # 回車
t # 制表符Tab
c # 代表任一其他字符
-F"[ ]+|[%]+" # 多個空格或多個%為分隔符
[a-z]+ # 多個小寫字母
[a-Z] # 代表所有大小寫字母(aAbB...zZ)
[a-z] # 代表所有大小寫字母(ab...z)
[:alnum:] # 字母數字字符
[:alpha:] # 字母字符
[:cntrl:] # 控制字符
[:digit:] # 數字字符
[:graph:] # 非空白字符(非空格、控制字符等)
[:lower:] # 小寫字母
[:print:] # 與[:graph:]相似,但是包含空格字符
[:punct:] # 標點字符
[:space:] # 所有的空白字符(換行符、空格、制表符)
[:upper:] # 大寫字母
[:xdigit:] # 十六進制的數字(0-9a-fA-F)
[[:digit:][:lower:]] # 數字和小寫字母(占一個字符)
內建變量{
$n # 當前記錄的第 n 個字段,字段間由 FS 分隔
$0 # 完整的輸入記錄
ARGC # 命令行參數的數目
ARGIND # 命令行中當前文件的位置 ( 從 0 開始算 )
ARGV # 包含命令行參數的數組
CONVFMT # 數字轉換格式 ( 默認值為 %.6g)
ENVIRON # 環境變量關聯數組
ERRNO # 最后一個系統錯誤的描述
FIELDWIDTHS # 字段寬度列表 ( 用空格鍵分隔 )
FILENAME # 當前文件名
FNR # 同 NR ,但相對于當前文件
FS # 字段分隔符 ( 默認是任何空格 )
IGNORECASE # 如果為真(即非 0 值),則進行忽略大小寫的匹配
NF # 當前記錄中的字段數(列)
NR # 當前行數
OFMT # 數字的輸出格式 ( 默認值是 %.6g)
OFS # 輸出字段分隔符 ( 默認值是一個空格 )
ORS # 輸出記錄分隔符 ( 默認值是一個換行符 )
RLENGTH # 由 match 函數所匹配的字符串的長度
RS # 記錄分隔符 ( 默認是一個換行符 )
RSTART # 由 match 函數所匹配的字符串的第一個位置
SUBSEP # 數組下標分隔符 ( 默認值是 /034)
BEGIN # 先處理(可不加文件參數)
END # 結束時處理
}
內置函數{
gsub(r,s) # 在整個$0中用s替代r 相當于 sed 's///g'
gsub(r,s,t) # 在整個t中用s替代r
index(s,t) # 返回s中字符串t的第一位置
length(s) # 返回s長度
match(s,r) # 測試s是否包含匹配r的字符串
split(s,a,fs) # 在fs上將s分成序列a
sprint(fmt,exp) # 返回經fmt格式化后的exp
sub(r,s) # 用$0中最左邊最長的子串代替s 相當于 sed 's///'
substr(s,p) # 返回字符串s中從p開始的后綴部分
substr(s,p,n) # 返回字符串s中從p開始長度為n的后綴部分
}
awk判斷{
awk '{print ($1>$2)?"第一排"$1:"第二排"$2}' # 條件判斷 括號代表if語句判斷 "?"代表then ":"代表else
awk '{max=($1>$2)? $1 : $2; print max}' # 條件判斷 如果$1大于$2,max值為為$1,否則為$2
awk '{if ( $6 > 50) print $1 " Too high" ;
else print "Range is OK"}' file
awk '{if ( $6 > 50) { count++;print $3 }
else { x+5; print $2 } }' file
}
awk循環{
awk '{i = 1; while ( i <= NF ) { print NF, $i ; i++ } }' file
awk '{ for ( i = 1; i <= NF; i++ ) print NF,$i }' file
}
awk '/Tom/' file # 打印匹配到得行
awk '/^Tom/{print $1}' # 匹配Tom開頭的行 打印第一個字段
awk '$1 !~ /ly$/' # 顯示所有第一個字段不是以ly結尾的行
awk '$3 <40' # 如果第三個字段值小于40才打印
awk '$4==90{print $5}' # 取出第四列等于90的第五列
awk '/^(no|so)/' test # 打印所有以模式no或so開頭的行
awk '$3 * $4 > 500' # 算術運算(第三個字段和第四個字段乘積大于500則顯示)
awk '{print NR" "$0}' # 加行號
awk '/tom/,/suz/' # 打印tom到suz之間的行
awk '{a+=$1}END{print a}' # 列求和
awk 'sum+=$1{print sum}' # 將$1的值疊加后賦給sum
awk '{a+=$1}END{print a/NR}' # 列求平均值
awk '!s[$1 $3]++' file # 根據第一列和第三列過濾重復行
awk -F'[ :t]' '{print $1,$2}' # 以空格、:、制表符Tab為分隔符
awk '{print "'"$a"'","'"$b"'"}' # 引用外部變量
awk '{if(NR==52){print;exit}}' # 顯示第52行
awk '/關鍵字/{a=NR+2}a==NR {print}' # 取關鍵字下第幾行
awk 'gsub(/liu/,"aaaa",$1){print $0}' # 只打印匹配替換后的行
ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}' # 提取時間,空格不固定
awk '{$1="";$2="";$3="";print}' # 去掉前三列
echo aada:aba|awk '/d/||/b/{print}' # 匹配兩內容之一
echo aada:abaa|awk -F: '$1~/d/||$2~/b/{print}' # 關鍵列匹配兩內容之一
echo Ma asdas|awk '$1~/^[a-Z][a-Z]$/{print }' # 第一個域匹配正則
echo aada:aaba|awk '/d/&&/b/{print}' # 同時匹配兩條件
awk 'length($1)=="4"{print $1}' # 字符串位數
awk '{if($2>3){system ("touch "$1)}}' # 執行系統命令
awk '{sub(/mac/,"Macintosh",$0);print}' # 用Macintosh替換Mac
awk '{gsub(/Mac/,"MacIntosh",$1); print}' # 第一個域內用Macintosh替換Mac
awk -F '' '{ for(i=1;i<NF+1;i++)a+=$i ;print a}' # 多位數算出其每位數的總和.比如 1234, 得到 10
awk '{ i=$1%10;if ( i == 0 ) {print i}}' # 判斷$1是否整除(awk中定義變量引用時不能帶 $ )
awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}' # 列求最大值 設定一個變量開始為0,遇到比該數大的值,就賦值給該變量,直到結束
awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}' # 求最小值
awk '{if(A)print;A=0}/regexp/{A=1}' # 查找字符串并將匹配行的下一行顯示出來,但并不顯示匹配行
awk '/regexp/{print A}{A=$0}' # 查找字符串并將匹配行的上一行顯示出來,但并不顯示匹配行
awk '{if(!/MySQL/)gsub(/1/,"a");print $0}' # 將1替換成a,并且只在行中未出現字串mysql的情況下替換
awk 'BEGIN{srand();fr=int(100*rand());print fr;}' # 獲取隨機數
awk '{if(NR==3)F=1}{if(F){i++;if(i%7==1)print}}' # 從第3行開始,每7行顯示一次
awk '{if(NF<1){print i;i=0} else {i++;print $0}}' # 顯示空行分割各段的行數
echo +null:null |awk -F: '$1!~"^+"&&$2!="null"{print $0}' # 關鍵列同時匹配
awk -v RS=@ 'NF{for(i=1;i<=NF;i++)if($i) printf $i;print ""}' # 指定記錄分隔符
awk '{b[$1]=b[$1]$2}END{for(i in b){print i,b[i]}}' # 列疊加
awk '{ i=($1%100);if ( $i >= 0 ) {print $0,$i}}' # 求余數
awk '{b=a;a=$1; if(NR>1){print a-b}}' # 當前行減上一行
awk '{a[NR]=$1}END{for (i=1;i<=NR;i++){print a[i]-a[i-1]}}' # 當前行減上一行
awk -F: '{name[x++]=$1};END{for(i=0;i<NR;i++)print i,name[i]}' # END只打印最后的結果,END塊里面處理數組內容
awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' # $2的總和 $2總和除個數(平均值)
awk -v a=0 -F 'B' '{for (i=1;i<NF;i++){ a=a+length($i)+1;print a }}' # 打印所以B的所在位置
awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' file # 將date值賦給d,并將d設置為數組mon,打印mon數組中第2個元素
awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' # 截取字符串(substr使用)
awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' # 匹配字符串(index使用)
awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' # 正則表達式匹配查找(match使用)
awk '{for(i=1;i<=4;i++)printf $i""FS; for(y=10;y<=13;y++) printf $y""FS;print ""}' # 打印前4列和后4列
awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}' # 乘法口訣
awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' # 字符串分割(split使用)
awk '{if (system ("grep "$2" tmp/* > /dev/null 2>&1") == 0 ) {print $1,"Y"} else {print $1,"N"} }' a # 執行系統命令判斷返回狀態
awk '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf a[i,j] " ";print ""}}' # 將多行轉多列
netstat -an|awk -v A=$IP -v B=$PORT 'BEGIN{print "ClientstGuest_ip"}$4~A":"B{split($5,ip,":");a[ip[1]]++}END{for(i in a)print a[i]"t"i|"sort -nr"}' # 統計IP連接個數
cat 1.txt|awk -F" # " '{print "insert into user (user,password,email)values(""'''"$1"'','""'''"$2"'','""'''"$3"'');'"}' >>insert_1.txt # 處理sql語句
awk 'BEGIN{printf "what is your name?";getline name < "/dev/tty" } $1 ~name {print "FOUND" name " on line ", NR "."} END{print "see you," name "."}' file # 兩文件匹配
取本機IP{
/sbin/ifconfig |awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print $2}'
/sbin/ifconfig |awk '/inet/&&$2!~"127.0.0.1"{split($2,a,":");print a[2]}'
/sbin/ifconfig |awk -v RS='inet addr:' '$1!="eth0"&&$1!="127.0.0.1"{print $1}'|awk '{printf"%s|",$0}'
/sbin/ifconfig |awk '{printf("line %d,%sn",NR,$0)}' # 指定類型(%d數字,%s字符)
}
查看磁盤空間{
df -h|awk -F"[ ]+|%" '$5>14{print $5}'
df -h|awk 'NR!=1{if ( NF == 6 ) {print $5} else if ( NF == 5) {print $4} }'
df -h|awk 'NR!=1 && /%/{sub(/%/,"");print $(NF-1)}'
df -h|sed '1d;/ /!N;s/n//;s/ +/ /;' #將磁盤分區整理成一行 可直接用 df -P
}
排列打印{
awk 'END{printf "%-10s%-10sn%-10s%-10sn%-10s%-10sn","server","name","123","12345","234","1234"}' txt
awk 'BEGIN{printf "|%-10s|%-10s|n|%-10s|%-10s|n|%-10s|%-10s|n","server","name","123","12345","234","1234"}'
awk 'BEGIN{
print " *** 開 始 *** ";
print "+-----------------+";
printf "|%-5s|%-5s|%-5s|n","id","name","ip";
}
$1!=1 && NF==4{printf "|%-5s|%-5s|%-5s|n",$1,$2,$3" "$11}
END{
print "+-----------------+";
print " *** 結 束 *** "
}' txt
}
awk經典題{
分析圖片服務日志,把日志(每個圖片訪問次數*圖片大小的總和)排行,也就是計算每個url的總訪問大小
說明:本題生產環境應用:這個功能可以用于IDC網站流量帶寬很高,然后通過分析服務器日志哪些元素占用流量過大,進而進行優化或裁剪該圖片,壓縮js等措施。
本題需要輸出三個指標: 【被訪問次數】 【訪問次數*單個被訪問文件大小】 【文件名(帶URL)】
測試數據
59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299
awk '{array_num[$7]++;array_size[$7]+=$10}END{for(i in array_num) {print array_num[i]" "array_size[i]" "i}}'
}
awk練習題{
wang 4
cui 3
zhao 4
liu 3
liu 3
chang 5
li 2
1 通過第一個域找出字符長度為4的
2 當第二列值大于3時,創建空白文件,文件名為當前行第一個域$1 (touch $1)
3 將文檔中 liu 字符串替換為 hong
4 求第二列的和
5 求第二列的平均值
6 求第二列中的最大值
7 將第一列過濾重復后,列出每一項,每一項的出現次數,每一項的大小總和
1、字符串長度
awk 'length($1)=="4"{print $1}'
2、執行系統命令
awk '{if($2>3){system ("touch "$1)}}'
3、gsub(/r/,"s",域) 在指定域(默認$0)中用s替代r (sed 's///g')
awk '{gsub(/liu/,"hong",$1);print $0}' a.txt
4、列求和
awk '{a+=$2}END{print a}'
5、列求平均值
awk '{a+=$2}END{print a/NR}'
awk '{a+=$2;b++}END{print a,a/b}'
6、列求最大值
awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}'
7、將第一列過濾重復列出每一項,每一項的出現次數,每一項的大小總和
awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}'
}
awk處理復雜日志{
6.19:
DHB_014_號百總機服務業務日報:廣州 到達數異常!
DHB_023_號百漏話提醒日報:珠海 到達數異常!
6.20:
DHB_014_號百總機服務業務日報:廣州 到達數異常!到
awk -F '[_ :]+' 'NF>2{print $4,$1"_"$2,b |"sort";next}{b=$1}'
# 當前行NF小于等于2 只針對{print $4,$1"_"$2,b |"sort";next} 有效 即 6.19:行跳過此操作, {b=$1} 仍然執行
# 當前行NF大于2 執行到 next 強制跳過本行,即跳過后面的 {b=$1}
廣州 DHB_014 6.19
}
}
sed{
# 先讀取資料、存入模式空間、對其進行編輯、再輸出、再用下一行替換模式空間內容
# 調試工具sedsed (參數 -d) http://aurelio.net/sedsed/sedsed-1.0
-n # 輸出由編輯指令控制(取消默認的輸出,必須與編輯指令一起配合)
-i # 直接對文件操作
-e # 多重編輯
-r # 正則可不轉移特殊字符
b # 跳過匹配的行
p # 打印
d # 刪除
s # 替換
g # 配合s全部替換
i # 行前插入
a # 行后插入
r # 讀
y # 轉換
q # 退出
& # 代表查找的串內容
* # 任意多個 前驅字符(前導符)
? # 0或1個 最小匹配 沒加-r參數需轉義 ?
$ # 最后一行
.* # 匹配任意多個字符
(a) # 保存a作為標簽1(1)
模式空間{
# 模式空間(兩行兩行處理) 模式匹配的范圍,一般而言,模式空間是輸入文本中某一行,但是可以通過使用N函數把多于一行讀入模式空間
# 暫存空間里默認存儲一個空行
n # 讀入下一行(覆蓋上一行)
h # 把模式空間里的行拷貝到暫存空間
H # 把模式空間里的行追加到暫存空間
g # 用暫存空間的內容替換模式空間的行
G # 把暫存空間的內容追加到模式空間的行后
x # 將暫存空間的內容于模式空間里的當前行互換
! # 對其前面的要匹配的范圍取反
D # 刪除當前模式空間中直到并包含第一個換行符的所有字符(/.*/匹配模式空間中所有內容,匹配到就執行D,沒匹配到就結束D)
N # 追加下一個輸入行到模式空間后面并在第二者間嵌入一個換行符,改變當前行號碼,模式匹配可以延伸跨域這個內嵌換行
p # 打印模式空間中的直到并包含第一個換行的所有字符
}
標簽函數{
: lable # 建立命令標記,配合b,t函數使用跳轉
b lable # 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。
t labe # 判斷分支,從最后一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令出,或者到腳本末尾。與b函數不同在于t在執行跳轉前會先檢查其前一個替換命令是否成功,如成功,則執行跳轉。
sed -e '{:p1;/A/s/A/AA/;/B/s/B/BB/;/[AB]{10}/b;b p1;}' # 文件內容第一行A第二行B:建立標簽p1;兩個替換函數(A替換成AA,B替換成BB)當A或者B達到10個以后調用b,返回
echo 'sd f f [a b c cddd eee]' | sed ':n;s#([[^ ]*) *#1#;tn' # 標簽函數t使用方法,替換[]里的空格
echo "198723124.03"|sed -r ':a;s/([0-9]+)([0-9]{3})/1,2/;ta' # 每三個字符加一個逗號
}
引用外部變量{
sed -n ''$a',10p'
sed -n ""$a",10p"
}
sed 10q # 顯示文件中的前10行 (模擬"head")
sed -n '$=' # 計算行數(模擬 "wc -l")
sed -n '5,/^no/p' # 打印從第5行到以no開頭行之間的所有行
sed -i "/^$f/d" a # 刪除匹配行
sed -i '/aaa/,$d' # 刪除匹配行到末尾
sed -i "s/=/:/" c # 直接對文本替換
sed -i "/^pearls/s/$/j/" # 找到pearls開頭在行尾加j
sed '/1/,/3/p' file # 打印1和3之間的行
sed -n '1p' file # 取出指定行
sed '5iaaa' file # 在第5行之前插入行
sed '5aaaa' file # 在第5行之后抽入行
echo a|sed -e '/a/ib' # 在匹配行前插入一行
echo a|sed -e '/a/ab' # 在匹配行后插入一行
echo a|sed 's/a/&nb/g' # 在匹配行后插入一行
seq 10| sed -e{1,3}'s/./a/' # 匹配1和3行替換
sed -n '/regexp/!p' # 只顯示不匹配正則表達式的行
sed '/regexp/d' # 只顯示不匹配正則表達式的行
sed '$!N;s/n//' # 將每兩行連接成一行
sed '/baz/s/foo/bar/g' # 只在行中出現字串"baz"的情況下將"foo"替換成"bar"
sed '/baz/!s/foo/bar/g' # 將"foo"替換成"bar",并且只在行中未出現字串"baz"的情況下替換
echo a|sed -e 's/a/#&/g' # 在a前面加#號
sed 's/foo/bar/4' # 只替換每一行中的第四個字串
sed 's/(.*)foo/1bar/' # 替換每行最后一個字符串
sed 's/(.*)foo(.*foo)/1bar2/' # 替換倒數第二個字符串
sed 's/[0-9][0-9]$/&5' # 在以[0-9][0-9]結尾的行后加5
sed -n ' /^eth|em[01][^:]/{n;p;}' # 匹配多個關鍵字
sed -n -r ' /eth|em[01][^:]/{n;p;}' # 匹配多個關鍵字
echo -e "1n2"|xargs -i -t sed 's/^/1/' {} # 同時處理多個文件
sed '/west/,/east/s/$/*VACA*/' # 修改west和east之間的所有行,在結尾處加*VACA*
sed 's/[^1-9]*([0-9]+).*/1/' # 取出第一組數字,并且忽略掉開頭的0
sed -n '/regexp/{g;1!p;};h' # 查找字符串并將匹配行的上一行顯示出來,但并不顯示匹配行
sed -n ' /regexp/{n;p;}' # 查找字符串并將匹配行的下一行顯示出來,但并不顯示匹配行
sed -n 's/(mar)got/1ianne/p' # 保存(mar)作為標簽1
sed -n 's/([0-9]+).*(t)/21/p' # 保存多個標簽
sed -i -e '1,3d' -e 's/1/2/' # 多重編輯(先刪除1-3行,在將1替換成2)
sed -e 's/@.*//g' -e '/^$/d' # 刪除掉@后面所有字符,和空行
sed -n -e "{s/^ *[0-9]*//p}" # 打印并刪除正則表達式的那部分內容
echo abcd|sed 'y/bd/BE/' # 匹配字符替換
sed '/^#/b;y/y/P/' 2 # 非#號開頭的行替換字符
sed '/suan/r readfile' # 找到含suan的行,在后面加上讀入的文件內容
sed -n '/no/w writefile' # 找到含no的行,寫入到指定文件中
sed '/regex/G' # 在匹配式樣行之后插入一空行
sed '/regex/{x;p;x;G;}' # 在匹配式樣行之前和之后各插入一空行
sed 'n;d' # 刪除所有偶數行
sed 'G;G' # 在每一行后面增加兩空行
sed '/^$/d;G' # 在輸出的文本中每一行后面將有且只有一空行
sed 'n;n;n;n;G;' # 在每5行后增加一空白行
sed -n '5~5p' # 只打印行號為5的倍數
seq 1 30|sed '5~5s/.*/a/' # 倍數行執行替換
sed -n '3,${p;n;n;n;n;n;n;}' # 從第3行開始,每7行顯示一次
sed -n 'h;n;G;p' # 奇偶調換
seq 1 10|sed '1!G;h;$!d' # 倒敘排列
ls -l|sed -n '/^.rwx.*/p' # 查找屬主權限為7的文件
sed = filename | sed 'N;s/n/t/' # 為文件中的每一行進行編號(簡單的左對齊方式)
sed 's/^[ t]*//' # 將每一行前導的"空白字符"(空格,制表符)刪除,使之左對齊
sed 's/^[ t]*//;s/[ t]*$//' # 將每一行中的前導和拖尾的空白字符刪除
sed '/{abc,def}/[111,222]/s/^/00000/' # 匹配需要轉行的字符: } / [
echo abcd\nabcde |sed 's/\n/@/g' |tr '@' 'n' # 將換行符轉換為換行
cat tmp|awk '{print $1}'|sort -n|sed -n '$p' # 取一列最大值
sed -n '{s/^[^/]*//;s/:.*//;p}' /etc/passwd # 取用戶家目錄(匹配不為/的字符和匹配:到結尾的字符全部刪除)
sed = filename | sed 'N;s/^/ /; s/ *(.{6,})n/1 /' # 對文件中的所有行編號(行號在左,文字右端對齊)
/sbin/ifconfig |sed 's/.*inet addr:(.*) Bca.*/1/g' |sed -n '/eth/{n;p}' # 取所有IP
修改keepalive配置剔除后端服務器{
sed -i '/real_server.*10.0.1.158.*8888/,+8 s/^/#/' keepalived.conf
sed -i '/real_server.*10.0.1.158.*8888/,+8 s/^#//' keepalived.conf
}
模仿rev功能{
echo 123 |sed '/n/!G;s/(.)(.*n)/&21/;//D;s/.//;'
/n/!G; # 沒有n換行符,要執行G,因為保留空間中為空,所以在模式空間追加一空行
s/(.)(.*n)/&21/; # 標簽替換 &n23n1$ (關鍵在于& ,可以讓后面//匹配到空行)
//D; # D 命令會引起循環刪除模式空間中的第一部分,如果刪除后,模式空間中還有剩余行,則返回 D 之前的命令,重新執行,如果 D 后,模式空間中沒有任何內容,則將退出。 //D 匹配空行執行D,如果上句s沒有匹配到,//也無法匹配到空行, "//D;"命令結束
s/.//; # D結束后,刪除開頭的 n
}
}
xargs{
# 命令替換
-t 先打印命令,然后再執行
-i 用每項替換 {}
find / -perm +7000 | xargs ls -l # 將前面的內容,作為后面命令的參數
seq 1 10 |xargs -i date -d "{} days " +%Y-%m-%d # 列出10天日期
}