1、總結sed和awk的詳細用法;
SED
sed模式空間 默認不編輯源文件,僅對模式空間中的數據做處理:而后,處理結束后,將模式空間打印屏幕 sed [options]'address+command' file... -n:靜默模式,不再默認顯示模式空間的內容 -i:直接修改原文件 -e script -e script 同時執行多個腳本 -f /path/to/script file -r :表示使用擴展正則表達式 address: 1.startline,endline 比如1,100 2./regexp/ /^root/ 3./pattern1/,/pattern2/ 第一次被pattern1匹配到的行開始,至第一次被pattern2匹配到的行結束,這中間的所以行 4.linenumber 指定行 5.startline,+N 從startline開始,向后的n行 6.步進行 1~2 奇數行 2~2 偶數行 7.$ 最后一行 command: d:刪除符合條件的行 P: 顯示符合條件的行 a \string:在指定的行后面追加新行,內容為“string” i \string:在指定的行前面追加新行,內容為“string” c \string:將匹配到的的行替換為此處指定的文本text r file:文件合并 w file:將地址指定的范圍內的行另存為至指定文件中 =:為模式匹配到的行數的行打印行號 !取反 地址定界!編輯命令 s/pattern/string/修飾符:查找并替換,默認只替換每一行被模式匹配到的字符串 加修飾符 g:全局替換 i:忽略字符大小寫 w /path/to/somefile:將替換成功的結果保存至指定文件中 p:顯示替換成功的行 s///=s###=s@@@ \(\),\1,\2 sed ‘s/l..k/&r/g’ sed 's/\(l..k\)/\1r/g ' &:引用匹配模式的整個串 高級編輯命令 h:表示把模式空間的內容保存至保持空間 H:把模式空間中的內容追加至保持空間 g:把保持空間的內容覆蓋至模式空間 G:把保持空間的內容追加至模式空間 x:把模式空間的內容與保持空間中內容互換 n:讀取匹配到行的下一行至模式空間 N: 追加讀取匹配到的行的下一行至模式空間中 D:刪除多行模式空間中所有行
AWK
內建變量 FS:input field seperator,默認為空白字符 OFS:output field seperator,默認為空白字符 RS:input record seperator,輸入時的換行符 ORS:outpout record seperator,輸出時的換行符 NF:number of filed,字段數量 {print NF},{print $NF} NR:number of record,行數 FNR:各文件分別計數,行數 FILENMAE當前文件名字 ARGC: 命令行參數的個數 ARGV: 數組,保存的是命令行所給定的各參數 printf命令 格式化輸出:printf format,item1,item2... (1)format必須給出 (2)不會自動換行,需要顯式給出換行符,\n (3)format中需要分別為后面的每個item指定一個 格式化符號 %c:顯示字符串的ascii碼 %d,%i:顯示十進制整數 %e,%E:科學計數法數值顯示 %f,顯示為浮點型 %g,%G:以科學計數法或浮點型形式顯示數值 %s:顯示字符串 %u:無字符串 %%:顯示%本身 條件表達式: selector?if-true-expression:if-false-expression eg: awk -F: '{$3>=1000?usertype='common user':usertype="system admin";printf "%15s:%-s\n",$1,usertype}' awk -F: 'printf "%15s:%-s",%1,(%3>1000?"common user":"system user")' pattern (1)empty 空模式,匹配每一行 (2)/regular expression/:僅處理能夠被此處的模式匹配到的行 (3)relational expression:關系表達式,結果有“真”有“假”,結果為真才會處理 eg: awk -F':' '$NF==/bin/bash {print $1,$NF}' /etc/passwd awk -F':' '$NF~/bash$/ {print $1,$NF}' /etc/passwd line range:行范圍 startline,endline:/pat1/,/pat2/ 注意;不支持直接給出數字的格式 ~]# awk -F : '(NR>=2&&NR<=10){print $1}' /etc/passwd BEGIN/END模式 BEGIN{}:僅在開始處理文件中文本之前執行一次 END{}:僅在文本處理完成之后執行一次 常見的action (1)expression (2)control statements: if,while等 (3)compound statement:組合語句 (4)input statement (5)output statement 控制語句 if(condition){statment} if(condition){statment} else {statement} while(condition){statement} do{statement} while(codition) for(exp1,exp2,exp3){statement} break continue delete arry[index] delete arry exit {statement} if-else 語法:if(condition) statement [else statement] awk -F: '{if($3>1000) print $1,$3}' /etc/passwd awk -F: '{if($3>=1000) {printf "common user: %s\n",$1} else {printf "root or system:%s\n",$1} }' /etc/passwd 使用場景:對awk取得的整行或某個字段做條件判斷; while循環 語法:while(condition) statement 使用場景:對一行內的多個字段逐一類似處理時使用,對數組中逐一處理時使用 awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /boot/grub2/grub.cfg awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>7){print $i,length($i)}; i++}}' /boot/grub2/grub.cfg do-wile循環 語法:do statement while(condition) 意義;至少執行一次循環 for循環 語法:for(epr1;epr2;epr3) statement awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /boot/grub2/grub.cfg awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {if(length($i) > 7){print $i,length($i)}}}' /boot/grub2/grub.cfg 特殊用法: 能夠遍歷數組中的元素: 語法: for(var in arry) (for-body) switch語句 語法:switch(expression){case VALUE or /REGEXP/:statement;case VALUE2 or /REGEXP2/: statement;...;default:statement} break和continue break [n] continue next 提前結束對本行的處理而直接進入下一行 awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd awk 數組 關聯數組:array[index-expression] index-expression: (1)可使用任意字符串,字符串要加雙引號 (2)如果某組元素事先不存在,在引用時,awk會自動創建此元素,并將某值初始化為“空串”: 若要判斷數組中是否存在某元素,要使用“index in array”格式進行 若要遍歷數組中的每個元素,要使用for循環 awk 'BEGIN{weekdays["mon"]="monday";weekdays["tue"]="tuesday";for(i in weekdays) {print weekdays[i]}}' 注意:var會遍歷array的每個索引 netstat -nta | awk '/^tcp\>/{state[$NF]++}END{for(i in state){print i,state[i]}}' 統計指定文件中每個單詞出現的次數 awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}' /etc/fstab
2、刪除/boot/grub/grub.conf文件中所有行的行首的空白字符;
vim: %s@^[[:space:]]+@@g
sed:sed -i -r ‘s/^[[:space:]]+//g’ /boot/grub/grub.conf
3、刪除/etc/fstab文件中所有以#開頭,后跟至少一個空白字符的行的行首的#和空白字符;
vim: %s@^#[[:space:]]+@@g
sed: sed -i -r ‘s/^#[[:space:]]+//g’ /etc/fstab
4、把/etc/fstab文件的奇數行另存為/tmp/fstab.3;
sed: sed -n ‘1~2p’ /etc/fstab > /tmp/fstab.3
sed: sed ‘n;d’ /etc/fstab > /tmp/fstab.3
5、echo一個文件路徑給sed命令,取出其基名;進一步地,取出其路徑名;
echo “/etc/fstab/tab” | sed -r -n ‘s@^/.*/([^/]+$)@\1@p’
echo “/etc/fstab/tab/tab1” | sed -r -n ‘s@(^/.*/)[^/]+$@\1@p’
6、統計指定文件中所有行中每個單詞出現的次數;
awk ‘{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}’ /boot/grub/grub.conf
7、統計當前系統上所有tcp連接的各種狀態的個數;
netstat -nta | awk ‘/^tcp>/{count[$6]++}END{for(i in count){print i,count[i]}}’
8、統計指定的web訪問日志中各ip的資源訪問次數:
awk ‘{count[$1]++}END{for(i in count){print i,count[i]}}’ access.log
9、寫一個腳本:定義一個數組,數組元素為/var/log目錄下所有以.log結尾的文件的名字;顯示每個文件的行數;
#!/bin/bash declare -A logs for i in `ls /var/log/*.log`;do log_lines=`wc -l $i` logs[$i]=$log_lines echo "${logs[$i]}" done
10、寫一個腳本,能從所有同學中隨機挑選一個同學回答問題;進一步地:可接受一個參數,做為要挑選的同學的個數;
#!/bin/bash if [ $1 ];then for((i=1;i<=$1;i++));then a=$[$RANDOM%11] echo $a else a=$[$RANDOM%11] echo $a fi
11、授權centos用戶可以運行fdisk命令完成磁盤管理,以及使用mkfs或mke2fs實現文件系統管理;
visudo centos ALL=(root) NOPASSWD:/usr/sbin/fdisk /usr/sbin/mkfs /sbin/mke2fs
12、授權gentoo用戶可以運行邏輯卷管理的相關命令;
visudo Cmnd_Alias LVM=/sbin/pvcreate /sbin/vgcreate /sbin/lvcreate /sbin/vgextend /sbin/lvextend gentoo ALL=(root) NOPASSWD:LVM
13、基于pam_time.so模塊,限制用戶通過sshd服務遠程登錄只能在工作時間進行;
~]# vim /etc/pam.d/sshd #%PAM-1.0 auth required pam_sepermit.so auth include password-auth account required pam_nologin.so account required pam_time.so account include password-auth password include password-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open env_params session required pam_namespace.so session optional pam_keyinit.so force revoke session include password-auth ~]# /etc/security/time.conf sshd;*;root;Wk0900-1800
14、基于pam_listfile.so模塊,定義僅某些用戶,或某些組內的用戶可登錄系統;
]# vim sshd #%PAM-1.0 auth required pam_sepermit.so auth include password-auth account required pam_nologin.so account required pam_listfile.so item=user sense=allow file=/etc/user_allow onerr=succeed account required pam_time.so account include password-auth password include password-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open env_params session required pam_namespace.so session optional pam_keyinit.so force revoke session include password-auth ~]# vim /etc/user_allow root ~]#chmod 600 /etc/user_allow
原創文章,作者:N25_隨心,如若轉載,請注明出處:http://www.www58058.com/73655
寫的很好,為什么中間部分的排版跟別的不一樣那