tr 基本語法
-c # 用字符串1中字符集的補(bǔ)集替換此字符集,要求字符集為ASCII
-d # 刪除字符串1中所有輸入字符
-s # 刪除所有重復(fù)出現(xiàn)字符序列,只保留第一個(gè):即將重復(fù)出現(xiàn)字符串壓縮為一個(gè)字符串
[a-z] # a-z內(nèi)的字符組成的字符串
[A-Z] # A-Z內(nèi)的字符組成的字符串
[0-9] # 數(shù)字串
\octal # 一個(gè)三位的八進(jìn)制數(shù),對應(yīng)有效的ASCII字符
[O*n] # 表示字符O重復(fù)出現(xiàn)指定次數(shù)n。因此[O*2]匹配OO的字符串
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國際域名空間、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、永清網(wǎng)站維護(hù)、網(wǎng)站推廣。
tr中特定控制字符表達(dá)方式
\a Ctrl-G \007 # 鈴聲
\b Ctrl-H \010 # 退格符
\f Ctrl-L \014 # 走行換頁
\n Ctrl-J \012 # 新行
\r Ctrl-M \015 # 回車
\t Ctrl-I \011 # tab鍵
\v Ctrl-X \030
tr A-Z a-z # 將所有大寫轉(zhuǎn)換成小寫字母
tr " " "\n" # 將空格替換為換行
tr -s "[\012]" < plan.txt # 刪除空行
tr -s ["\n"] < plan.txt # 刪除空行
tr -s "[\015]" "[\n]" < file # 刪除文件中的^M,并代之以換行
tr -s "[\r]" "[\n]" < file # 刪除文件中的^M,并代之以換行
tr -s "[:]" "[\011]" < /etc/passwd # 替換passwd文件中所有冒號,代之以tab鍵
tr -s "[:]" "[\t]" < /etc/passwd # 替換passwd文件中所有冒號,代之以tab鍵
echo $PATH | tr ":" "\n" # 增加顯示路徑可讀性
1,$!tr -d '\t' # tr在vi內(nèi)使用,在tr前加處理行范圍和感嘆號('$'表示最后一行)
tr "\r" "\n" unixfile # Mac -> UNIX
tr "\n" "\r" macfile # UNIX -> Mac
tr -d "\r" unixfile # DOS -> UNIX Microsoft DOS/Windows 約定,文本的每行以回車字符(\r)并后跟換行符(\n)結(jié)束
awk '{ print $0"\r" }' dosfile # UNIX -> DOS:在這種情況下,需要用awk,因?yàn)閠r不能插入兩個(gè)字符來替換一個(gè)字符
#!/bin/sh # 在腳本第一行腳本頭 # sh為當(dāng)前系統(tǒng)默認(rèn)shell,可指定為bash等shell
sh -x # 執(zhí)行過程
sh -n # 檢查語法
(a=bbk) # 括號創(chuàng)建子shell運(yùn)行
basename $0 # 從文件名中去掉路徑和擴(kuò)展名
dirname # 取路徑
$RANDOM # 隨機(jī)數(shù)
$$ # 進(jìn)程號
source FileName # 在當(dāng)前bash環(huán)境下讀取并執(zhí)行FileName中的命令 # 等同 . FileName
sleep 5 # 間隔睡眠5秒
trap # 在接收到信號后將要采取的行動(dòng)
trap "" 2 3 # 禁止ctrl+c
$PWD # 當(dāng)前目錄
$HOME # 家目錄
$OLDPWD # 之前一個(gè)目錄的路徑
cd - # 返回上一個(gè)目錄路徑
yes # 重復(fù)打印
yes |rm -i * # 自動(dòng)回答y或者其他
ls -p /home # 查看目錄所有文件夾
ls -d /home/ # 查看匹配完整路徑
echo -n aa;echo bb # 不換行執(zhí)行下一句話
echo -e "s\tss\n\n\n" # 使轉(zhuǎn)義生效
echo $a | cut -c2-6 # 取字符串中字元
echo {a,b,c}{a,b,c}{a,b,c} # 排列組合(括號內(nèi)一個(gè)元素分別和其他括號內(nèi)元素組合)
echo $((2#11010)) # 二進(jìn)制轉(zhuǎn)10進(jìn)制
echo aaa | tee file # 打印同時(shí)寫入文件 默認(rèn)覆蓋 -a追加
echo {1..10} # 打印10個(gè)字符
printf '%10s\n'|tr " " a # 打印10個(gè)字符
pwd | awk -F/ '{ print $2 }' # 返回目錄名
tac file |sed 1,3d|tac # 倒置讀取文件 # 刪除最后3行
tail -3 file # 取最后3行
outtmp=/tmp/$$`date +%s%N`.outtmp # 臨時(shí)文件定義
:(){ :|:& };: # 著名的 fork×××,系統(tǒng)執(zhí)行海量的進(jìn)程,直到系統(tǒng)僵死
echo -e "\033[0;31mL\033[0;32mO\033[0;33mV\033[0;34mE\t\033[0;35mY\033[0;36mO\033[0;32mU\e[m" # 打印顏色
seq 語法1
# 不指定起始數(shù)值,則默認(rèn)為 1
-s # 選項(xiàng)主要改變輸出的分格符, 預(yù)設(shè)是 \n
-w # 等位補(bǔ)全,就是寬度相等,不足的前面補(bǔ) 0
-f # 格式化輸出,就是指定打印的格式
seq 10 100 # 列出10-100
seq 1 10 |tac # 倒敘列出
seq -s '+' 90 100 |bc # 從90加到100
seq -f 'dir%g' 1 10 | xargs mkdir # 創(chuàng)建dir1-10
seq -f 'dir%03g' 1 10 | xargs mkdir # 創(chuàng)建dir001-010
sed
sed 10q # 顯示文件中的前10行 (模擬"head")
sed -n '$=' # 計(jì)算行數(shù)(模擬 "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' 文件 # 取出指定行
sed '5i\aaa' file # 在第5行之前插入行
sed '5a\aaa' file # 在第5行之后抽入行
echo a|sed -e '/a/i\b' # 在匹配行前插入一行
echo a|sed -e '/a/a\b' # 在匹配行后插入一行
echo a|sed 's/a/&\nb/g' # 在匹配行后插入一行
seq 10| sed -e{1,3}'s/./a/' # 匹配1和3行替換
sed -n '/regexp/!p' # 只顯示不匹配正則表達(dá)式的行
sed '/regexp/d' # 只顯示不匹配正則表達(dá)式的行
sed '$!N;s/\n//' # 將每兩行連接成一行
sed '/baz/s/foo/bar/g' # 只在行中出現(xiàn)字串"baz"的情況下將"foo"替換成"bar"
sed '/baz/!s/foo/bar/g' # 將"foo"替換成"bar",并且只在行中未出現(xiàn)字串"baz"的情況下替換
echo a|sed -e 's/a/#&/g' # 在a前面加#號
sed 's/foo/bar/4' # 只替換每一行中的第四個(gè)字串
sed 's/\(.*\)foo/\1bar/' # 替換每行最后一個(gè)字符串
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替換倒數(shù)第二個(gè)字符串
sed 's/[0-9][0-9]$/&5' # 在以[0-9][0-9]結(jié)尾的行后加5
sed -n ' /^eth\|em[01][^:]/{n;p;}' # 匹配多個(gè)關(guān)鍵字
sed -n -r ' /eth|em[01][^:]/{n;p;}' # 匹配多個(gè)關(guān)鍵字
echo -e "1\n2"|xargs -i -t sed 's/^/1/' {} # 同時(shí)處理多個(gè)文件
sed '/west/,/east/s/$/*VACA*/' # 修改west和east之間的所有行,在結(jié)尾處加*VACA*
sed 's/[^1-9]*\([0-9]\+\).*/\1/' # 取出第一組數(shù)字,并且忽略掉開頭的0
sed -n '/regexp/{g;1!p;};h' # 查找字符串并將匹配行的上一行顯示出來,但并不顯示匹配行
sed -n ' /regexp/{n;p;}' # 查找字符串并將匹配行的下一行顯示出來,但并不顯示匹配行
sed -n 's/\(mar\)got/\1ianne/p' # 保存\(mar\)作為標(biāo)簽1
sed -n 's/\([0-9]\+\).*\(t\)/\2\1/p' # 保存多個(gè)標(biāo)簽
sed -i -e '1,3d' -e 's/1/2/' # 多重編輯(先刪除1-3行,在將1替換成2)
sed -e 's/@.*//g' -e '/^$/d' # 刪除掉@后面所有字符,和空行
sed -n -e "{s/文本(正則)/替換的內(nèi)容/p}" # 替換并打印出替換行
sed -n -e "{s/^ *[0-9]*//p}" # 打印并刪除正則表達(dá)式的那部分內(nèi)容
echo abcd|sed 'y/bd/BE/' # 匹配字符替換
sed '/^#/b;y/y/P/' 2 # 非#號開頭的行替換字符
sed '/suan/r 讀入文件' # 找到含suan的行,在后面加上讀入的文件內(nèi)容
sed -n '/no/w 寫入文件' # 找到含no的行,寫入到指定文件中
sed '/regex/G' # 在匹配式樣行之后插入一空行
sed '/regex/{x;p;x;G;}' # 在匹配式樣行之前和之后各插入一空行
sed 'n;d' # 刪除所有偶數(shù)行
sed 'G;G' # 在每一行后面增加兩空行
sed '/^$/d;G' # 在輸出的文本中每一行后面將有且只有一空行
sed 'n;n;n;n;G;' # 在每5行后增加一空白行
sed -n '5~5p' # 只打印行號為5的倍數(shù)
seq 1 30|sed '5~5s/.*/a/' # 倍數(shù)行執(zhí)行替換
sed -n '3,${p;n;n;n;n;n;n;}' # 從第3行開始,每7行顯示一次
sed -n 'h;n;G;p' # 奇偶調(diào)換
seq 1 10|sed '1!G;h;$!d' # 倒敘排列
ls -l|sed -n '/^.rwx.*/p' # 查找屬主權(quán)限為7的文件
sed = filename | sed 'N;s/\n/\t/' # 為文件中的每一行進(jìn)行編號(簡單的左對齊方式)
sed 's/^[ \t]*//' # 將每一行前導(dǎo)的"空白字符"(空格,制表符)刪除,使之左對齊
sed 's/^[ \t]*//;s/[ \t]*$//' # 將每一行中的前導(dǎo)和拖尾的空白字符刪除
echo abcd\\nabcde |sed 's/\\n/@/g' |tr '@' '\n' # 將換行符轉(zhuǎn)換為換行
cat tmp|awk '{print $1}'|sort -n|sed -n '$p' # 取一列最大值
sed -n '{s/^[^\/]*//;s/\:.*//;p}' /etc/passwd # 取用戶家目錄(匹配不為/的字符和匹配:到結(jié)尾的字符全部刪除)
sed = filename | sed 'N;s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' # 對文件中的所有行編號(行號在左,文字右端對齊)
/sbin/ifconfig |sed 's/.*inet addr:\(.*\) Bca.*/\1/g' |sed -n '/eth/{n;p}' # 取所有IP
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\)/&\2\1/;//D;s/.//;'
/\n/!G; # 沒有\(zhòng)n換行符,要執(zhí)行G,因?yàn)楸A艨臻g中為空,所以在模式空間追加一空行
s/\(.\)\(.*\n\)/&\2\1/; # 標(biāo)簽替換 &\n23\n1$ (關(guān)鍵在于& ,可以讓后面//匹配到空行)
//D; # D 命令會(huì)引起循環(huán)刪除模式空間中的第一部分,如果刪除后,模式空間中還有剩余行,則返回 D 之前的命令,重新執(zhí)行,如果 D 后,模式空間中沒有任何內(nèi)容,則將退出。
//D 匹配空行執(zhí)行D,如果上句s沒有匹配到,//也無法匹配到空行, "http://D;"命令結(jié)束
s/.//; # D結(jié)束后,刪除開頭的
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循環(huán)
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開頭的行 打印第一個(gè)字段
awk '$1 !~ /ly$/' # 顯示所有第一個(gè)字段不是以ly結(jié)尾的行
awk '$3 <40' # 如果第三個(gè)字段值小于40才打印
awk '$4==90{print $5}' # 取出第四列等于90的第五列
awk '/^(no|so)/' test # 打印所有以模式no或so開頭的行
awk '$3 * $4 > 500' # 算術(shù)運(yùn)算(第三個(gè)字段和第四個(gè)字段乘積大于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 -F'[ :\t]' '{print $1,$2}' # 以空格、:、制表符Tab為分隔符
awk '{print "'"$a"'","'"$b"'"}' # 引用外部變量
awk '{if(NR==52){print;exit}}' # 顯示第52行
awk '/關(guān)鍵字/{a=NR+2}a==NR {print}' # 取關(guān)鍵字下第幾行
awk 'gsub(/liu/,"aaaa",$1){print $0}' # 只打印匹配替換后的行
ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}' # 提取時(shí)間,空格不固定
awk '{$1="";$2="";$3="";print}' # 去掉前三列
echo aada:aba|awk '/d/||/b/{print}' # 匹配兩內(nèi)容之一
echo aada:abaa|awk -F: '$1~/d/||$2~/b/{print}' # 關(guān)鍵列匹配兩內(nèi)容之一
echo Ma asdas|awk '$1~/^[a-Z][a-Z]$/{print }' # 第一個(gè)域匹配正則
echo aada:aaba|awk '/d/&&/b/{print}' # 同時(shí)匹配兩條件
awk 'length($1)=="4"{print $1}' # 字符串位數(shù)
awk '{if($2>3){system ("touch "$1)}}' # 執(zhí)行系統(tǒng)命令
awk '{sub(/Mac/,"Macintosh",$0);print}' # 用Macintosh替換Mac
awk '{gsub(/Mac/,"MacIntosh",$1); print}' # 第一個(gè)域內(nèi)用Macintosh替換Mac
awk -F '' '{ for(i=1;i
awk '{ i=$1%10;if ( i == 0 ) {print i}}' # 判斷$1是否整除(awk中定義變量引用時(shí)不能帶 $ )
awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}' # 列求最大值 設(shè)定一個(gè)變量開始為0,遇到比該數(shù)大的值,就賦值給該變量,直到結(jié)束
awk 'BEGIN{a=11111}{if ($1
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,并且只在行中未出現(xiàn)字串mysql的情況下替換
awk 'BEGIN{srand();fr=int(100*rand());print fr;}' # 獲取隨機(jī)數(shù)
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}}' # 顯示空行分割各段的行數(shù)
echo +null:null |awk -F: '$1!~"^+"&&$2!="null"{print $0}' # 關(guān)鍵列同時(shí)匹配
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}}' # 求余數(shù)
awk '{b=a;a=$1; if(NR>1){print a-b}}' # 當(dāng)前行減上一行
awk '{a[NR]=$1}END{for (i=1;i<=NR;i++){print a[i]-a[i-1]}}' # 當(dāng)前行減上一行
awk -F: '{name[x++]=$1};END{for(i=0;i
awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' # $2的總和 $2總和除個(gè)數(shù)(平均值)
awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' file # 將date值賦給d,并將d設(shè)置為數(shù)組mon,打印mon數(shù)組中第2個(gè)元素
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";}' # 正則表達(dá)式匹配查找(match使用)
awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' # 字符串分割(split使用)
awk '{for(i=1;i<=4;i++)printf $i""FS; for(y=10;y<=13;y++) printf $y""FS;print ""}' # 打印前4列和后4列
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 ""}}' # 將多行轉(zhuǎn)多列
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 # 兩文件匹配
cat 1.txt|awk -F" # " '{print "insert into user (user,password,email)values(""'\''"$1"'\'\,'""'\''"$2"'\'\,'""'\''"$3"'\'\)\;'"}' >>insert_1.txt # 處理sql語句
取本機(jī)IP
/sbin/ifconfig |awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print $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,%s\n",NR,$0)}' # 指定類型(%d數(shù)字,%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/ \+/ /;' #將磁盤分區(qū)整理成一行 可直接用 df -P
排列打印
awk 'END{printf "%-10s%-10s\n%-10s%-10s\n%-10s%-10s\n","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 " *** 結(jié) 束 *** "
}' txt
老男孩awk經(jīng)典題
分析圖片服務(wù)日志,把日志(每個(gè)圖片訪問次數(shù)*圖片大小的總和)排行,也就是計(jì)算每個(gè)url的總訪問大小
說明:本題生產(chǎn)環(huán)境應(yīng)用:這個(gè)功能可以用于IDC網(wǎng)站流量帶寬很高,然后通過分析服務(wù)器日志哪些元素占用流量過大,進(jìn)而進(jìn)行優(yōu)化或裁剪該圖片,壓縮js等措施。
本題需要輸出三個(gè)指標(biāo): 【被訪問次數(shù)】 【訪問次數(shù)*單個(gè)被訪問文件大小】 【文件名(帶URL)】
測試數(shù)據(jù)
59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/p_w_picpaths/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練習(xí)題
wang 4
cui 3
zhao 4
liu 3
liu 3
chang 5
li 2
1 通過第一個(gè)域找出字符長度為4的
2 當(dāng)?shù)诙兄荡笥?時(shí),創(chuàng)建空白文件,文件名為當(dāng)前行第一個(gè)域$1 (touch $1)
3 將文檔中 liu 字符串替換為 hong
4 求第二列的和
5 求第二列的平均值
6 求第二列中的最大值
7 將第一列過濾重復(fù)后,列出每一項(xiàng),每一項(xiàng)的出現(xiàn)次數(shù),每一項(xiàng)的大小總和
1、字符串長度
awk 'length($1)=="4"{print $1}'
2、執(zhí)行系統(tǒng)命令
awk '{if($2>3){system ("touch "$1)}}'
3、gsub(/r/,"s",域) 在指定域(默認(rèn)$0)中用s替代r (sed 's///g')
awk '{gsub(/liu/,"hong",$1);print $0}' a.txt
4、列求和
df -h | awk '{a+=$2}END{print a}'
5、列求平均值
df -h | awk '{a+=$2}END{print a/NR}'
df -h | awk '{a+=$2;b++}END{print a,a/b}'
6、列求最大值
df -h | awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}'
7、將第一列過濾重復(fù)列出每一項(xiàng),每一項(xiàng)的出現(xiàn)次數(shù),每一項(xiàng)的大小總和
awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}'
}
網(wǎng)站名稱:shellawksedtrgrep語法匯總
標(biāo)題來源:
http://weahome.cn/article/poiehs.html