shell 编程(难题分析)
一、基礎知識:http://www.aminglinux.com/bbs/thread-6833-1-1.html
一、grep
用grep把passwd文檔中包含'root'或者‘500’的行過濾出來,并在過濾出來的行前面加上行號.
grep -n 'root\|500' passwd
r.o ? ? ? ? ? ? 如r1o,rto都滿足該條件,.表示匹配一個字符,僅僅一個字符
ooo* ? ? ? ? ?如oo,ooo,oooo...都滿足該條件,既表示在*前面的一個字符或者n個都滿足該條件,計算方法oo+0個o,oo+1個o都滿足
r.*t ? ? ? ? ? ?如rjidsjidishdi/: sjht 在r與t之間任意字符都滿足
二、sed的字符位置互換
如將test3:x:505:505::/home/test3:/bin/bash中的test3與bash替換位置,首先需要將這該該段劃分,具體劃分如下
(test3)(:x:505:505::/home/test3:/bin/)(bash)
? ?1 ? ? ? ? ? ? 2 ? ? ? ? ? ? 3 ? ? #通過括號將該段分為3段
(test3) ( ? ? ? ? .* ? ? ? ?) ?(bash) ? #第2段通過.*代替
sed 's/\(test3\)\(.*\)\(bash\)/\3\2\1/' ?文件名 ? ? #替換的方式,“\”表轉意?
bash:x:505:505::/home/test3:/bin/test3 ? ? ? ? ? ? ?#執行后的結果
替換中,如果不加g參數,那么只會把查到的第一個匹配的值進行替換,如語句(root:x:0:0:root:/root:/bin/bash)執行了sed 's/r//' 后,得到如下的語句
oot:x:0:0:root:/root:/bin/bash,那么說明只有第一個r被替換為空,其他的則沒有影響。
2、把/etc/passwd中出現的第一個數字和最后一個單詞替換位置?
原始數據
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--------------------------------------
?sed '1,$s/\([0-9]\)\(.*\)\([a-z]\)/\3\2\1/g' passwd
-------------------------------------------------------------
root:x:h:0:root:/root:/bin/bas0
bin:x:n:1:bin:/bin:/sbin/nologi1 ? ? #執行的結果是已每一行為一個單位,把出現的第一個數字與最后一個單詞執行了替換。
3、在passwd 20行到末行最前面加 'aaa:'
sed '20,$s/\(.*\)/aaa:\1/' passwd ? ?# “(.*)”表示的就是整個
sed '20,$s/\(.*\)/aaa:&/' passwd ? ?#&代表(.*)的內容
執行后的部分結果
aaa:apache:x:48:48:Apache:/var/www:/sbin/nologin
aaa:rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
aaa:mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
aaa:smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
aaa:webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
sed的大小寫替換
sed中,使用\u表示大寫,\l表示小寫
1. 把每個單詞的第一個小寫字母變大寫:
sed 's/\b[a-z]/\u&/g' filename
2. 把所有小寫變大寫:
sed 's/[a-z]/\u&/g' filename
3. 大寫變小寫:
sed 's/[A-Z]/\l&/g' filename
三、awk
基礎知識:http://www.aminglinux.com/bbs/thread-6833-1-1.html
截取文檔中的某段 awk -F ':' '{print $1}' 1.txt
也可以使用自定義字符連接每個段 awk -F':' '{print $1"#"$2"#"$3"#"$4}' 1.txt
匹配字符或字符串 awk '/oo/' 1.txt
針對某個段匹配 awk -F ':' '$1 ~/oo/' 1.txt
多次匹配 awk -F ':' '/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/' 1.txt ? #?$1 ~/test/ 表示匹配內容為第一段為test
條件操作符==, >,<,!=,>=;<=??
awk -F ':' '$3=="0"'??1.txt;?
awk -F ':' '$3>="500"' 1.txt;?
awk -F ':' '$7!="/sbin/nologin"'??1.txt;?
awk -F ':' '$3<$4' 1.txt ;?
awk -F ':' '$3>"5" && $3<"7"' 1.txt?
awk -F ':' '$3>"5" || $7=="/bin/bash"' 1.txt
awk內置變量 NF(段數)??NR(行數)
head -n3 1.txt | awk -F ':' '{print NF}'?
head -n3 1.txt | awk -F ':' '{print $NF}'?
head -n3 1.txt | awk -F ':' '{print NR}'?
打印20行以后的行awk 'NR>20' 1.txt
awk -F ':' 'NR>20 && $1 ~ /ssh/'??1.txt?
更改某個段的值awk -F ':' '$1="root"' 1.txt
數學計算, 把第三段和第四段值相加,并賦予第七段 awk -F ':' '{$7=$3+$4; print $0}' 1.txt
計算第三段的總和 awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt
awk中也可以使用if關鍵詞 awk -F ':' '{if ($1=="root") print $0}' 1.txt
用 ':' 作為分隔符,查找第一段為 'root' 的行,并把該段的 'root' 換成 'toor' (可以連同sed一起使用)
awk -F ':' '$1~/root/' passwd | sed 's/root/toor/g' ?#$1~/root/ 表示第一段匹配root的
date +%y-%m-%d ?-d "-5day" :表示5天以前,且格式為%y-%m-%d
變量賦值:a = 1 這是錯誤的,變量的賦值不能有空格,所以賦值方式為:a=1
1.從?a.log?文件中提取包含“WARNING”或”FATAL”,同時不包含“IGNOR”的行,然后,提取以“:”分割的第五個字段?
grep?-E?‘WARNING|FATAL’?a.log?|?grep-v’IGNOR’?|?awk?-F?:?’{print?$5?}’
轉載于:https://blog.51cto.com/469952080/1687067
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的shell 编程(难题分析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用自己的ID在appstore中更新ap
- 下一篇: 二维数组联通子数组和最大