1、總結sed和awk的詳細用法
sed: 語法結構 sed [OPTION]...'script' [input-file]...[action] -r:支持擴展正則表達式 -n:不輸出模式空間中的內容至屏幕 -e script1 -e script2 -e script3:指定多腳本運行 -f /path/to/script_file:從指定的文件中讀取腳本運行 -i:直接修改源文件 sed的地址定界 #:#表示數字,指定行 $:最后一行 /pattern/或%pattern%:任何能被pattern匹配到的行 #,/pattern/:從第#行開始,到第一次被pattern匹配到的行結束,中間的所有行 #1,#2:從#1到#2行 /pattern1/,/pattern2/:從第一次被pattern1匹配到的行開始,到第一次被pattern2匹配到的行結束,中間的所有行 #,+n:從#行開始,一直到向下的n行 1~2:所有奇數行 2~2:所有偶數行 sed的編輯命令 d:刪除模式空間中的行 =:為模式空間中的行打印行號 a \text:在行后面追加文本,支持使用\n實現多行追加 i \text:在行前面追加文本,支持使用\n實現多行追加 c \text:用text替換匹配到的行 p:打印模式空間中的行 s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等; 替換標記: g:全局替換; w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中; p:顯示替換成功的行; w /path/to/somefile:保存模式空間匹配到的行至指定的文件中; r /path/from/somefile:讀取指定文件的內容至當前文件被模式匹配到的行后面;文件合并; 高級編輯命令: h:把模式空間中的內容覆蓋至保持空間中; H:把模式空間中的內容追加至保持空間中; g:把保持空間中的內容覆蓋至模式空間中; G:把保持空間中的內容追加至模式空間中; x:把模式空間中的內容與保持空間中的內容互換; n:覆蓋讀取匹配到的行的下一行至模式空間中; N:追加讀取匹配到的行的下一行至模式空間中; d:刪除模式空間中的行; D:刪除多行模式空間中的所有行; awk: awk的運行模式有三種: (1)awk 命令行 # awk (2)awk 程序文件 # awk -f /path/from/awk_script (3)awk 腳本 # !/bin/awk -f awk的基本用法:awk [OPTION] 'program' FILE1 FILE2... 其中program:PATTERN{Action STATEMENT} program:編程語言 PATTERN:模式 ACTION STATEMENT:動作語句,可以是由多個語句組成,各語句間使用分號隔離; OPTONS: -F[]:指明輸入字段分隔符; -v VAR_NAME=VALUE:變量賦值; -f /PATH/FROM/AWK_SCRIPT; awk在處理文本時也是一次讀取一行文本,然后根據輸入分隔符(默認為空格)進行切片,切成n個片段,然后將每一片都賦予awk內部的一個變量中進行保存, 這些變量名為$1、$2、$3...,awk就可以對這些片段單獨處理, awk的輸出命令之print 用法:print item1,item2,... item:字符串,用引號引用 print "hello","world" 變量:顯示變量的值,可以直接使用變量的名進行引用 print name 數值:無需加引號 注: (1)各item之間要使用逗號隔開,輸出時的分隔符默認為空白字符 (2)輸出的各item可以為字符串或數值,當前記錄的字段($#),變量或awk的表達式;數值會被隱式轉換為字符串進行輸出 (3)print后面的item省略時,相當于運行“print $0”,用于輸出整行 (4)輸出空白字符 print " " 變量 分為內建變量和自定義變量 內建變量: FS:input Field Seperator,輸入字段分隔符,默認為空白字符 RS:input Record Seperator,輸入時的行分隔符,默認為換行符 OFS:Output Field Seperatro,輸出時的字段分隔符,默認為空白字符 ORS:Output Record Seperator,輸出時的行分隔符,默認為換行符 NF:number of field in current record,當前行的字段數 print NF:顯示當前行的字段數 print $NF:顯示當前行的第NF字段的值 NR:number of records,行數;命令后跟的所有文件將統一合并計數 FNR:行數,各文件單獨計數 FILENAME:當前正被awk讀取的文件的文件名 ARGC:awk命令行中的參數的個數 ARGV:數組,保存了命令行參數本身 ARGV[index] ARGV[0],ARGV[1] 自定義變量 (1)-v VAR_NAME=VALUE變量名區分字符大小寫 (2)在program中自定義變量 awk的輸出命令之printf格式化輸出 語法:printf FORMAT,item1,item2,... 注: (1)必須提供FORMAT (2)與print語句不同,printf不會自動換行,需要顯示指定換行符:\n (3)FORMAT中需要分別為后面的每個item指定一個格式符,否則item無法顯示 格式符:都以%開頭,后面跟單個字符 %c:顯示字符的ASCII碼 %d,%i:顯示為十進制整數 %e,%E:科學計數法或浮點數格式顯示數值 %f:顯示為浮點數 %g,%G:以科學計數法或浮點數格式顯示數值 %s:顯示為字符串 %u:顯示無符號整數 %%:顯示%符號自身 awk的操作符: awk的操作符有:算術操作符、字符操作符、賦值操作符、比較操作符、模式匹配操作符、邏輯操作符、條件表達式和函數調用 算術操作符:實現一些算術運算 字符操作符:字符串連接 賦值操作符:通常為變量的賦值 =,+=,-=,*=,/=,%=,^= ++,-- 比較操作符:字符串或者數值的大小比較 >,>=,<,<=,==,!= 模式匹配操作符:根據右側的模式進行匹配操作 ~:是否能由右側指定的模式所匹配 !~:是否不能由右側指定的模式所匹配 邏輯操作符:進行邏輯的運算 &&:與運算 ||:或運算 條件表達式: selector?if-trun-expression:if-false-expression 函數調用:調用函數來進行數據的處理 格式:function_name(argu1,argu2,...) PATTERN (1)empty:空模式,匹配每一行; (2)/regular expression/:僅處理能夠被此處的模式匹配到的行; (3)relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理; 真:結果為非0值,非空字符串; (4)line ranges:行范圍, startline,endline:/pat1/,/pat2/ 注意: 不支持直接給出數字的格式 ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd (5)BEGIN/END模式 BEGIN{}: 僅在開始處理文件中的文本之前執行一次; END{}:僅在文本處理完成之后執行一次; 常用的action (1)Expressions (2)Control statements:if, while等; (3)Compound statements:組合語句; (4)input statements (5)output statements 控制語句 if(condition) {statments} if(condition) {statments} else {statements} while(conditon) {statments} do {statements} while(condition) for(expr1;expr2;expr3) {statements} break continue delete array[index] delete array exit { statements } 數組 關聯數組:array[index-expression] index-expression: (1)可使用任意字符串;字符串要使用雙引號; (2)如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”; 若要判斷數組中是否存在某元素,要使用"index in array"格式進行; weekdays["mon"]="Monday" 若要遍歷數組中的每個元素,要使用for循環; for(var in array) {for-body} 函數 內置函數 數值處理: rand():返回0和1之間一個隨機數; 字符串處理: length([s]):返回指定字符串的長度; sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其第一次出現替換為s所表示的內容; gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其所有出現均替換為s所表示的內容; split(s,a[,r]):以r為分隔符切割字符s,并將切割后的結果保存至a所表示的數組中; 自定義函數
2、刪除/boot/grub/grub.conf文件中所有行的行首的空白字符
# sed -r 's/^[[:space:]]+//' /boot/grub/grub.conf
3、刪除/etc/fstab文件中所有以#開頭,后跟至少一個空白字符的行的行首的#和空白字符
# sed -r 's/^[#][[:space:]]+//' /etc/fstab # /etc/fstab Created by anaconda on Thu Jun 15 06:05:04 2017 # Accessible filesystems, by reference, are maintained under '/dev/disk' See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=78793bbc-ce37-49e2-91c3-ce7119a6c9f3 / xfs defaults 0 0 UUID=b03e3066-407e-445a-8e11-08a1d91d042d /boot xfs defaults 0 0 UUID=cbe5fb6e-c8ca-4e7f-84a0-c19967b93c41 swap swap defaults 0 0
4、把/etc/fstab文件的奇數行另存為/tmp/fstab.3
# sed '1~2w /tmp/fstab.3' /etc/fstab # cat /tmp/fstab.3 # /etc/fstab # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info UUID=78793bbc-ce37-49e2-91c3-ce7119a6c9f3 / xfs defaults 0 0 UUID=cbe5fb6e-c8ca-4e7f-84a0-c19967b93c41 swap swap defaults 0 0
5、echo一個文件路徑給sed命令,取出其基名;進一步地,取出其路徑名
# echo "/etc/fstab/xxxx/" | sed -r 's@^.*/([^/]+)/?$@\1@' xxxx
6、統計指定文件中所有行中每個單詞出現的次數
# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(j in count){print j,count[j]}}' /PATH/TO/SOMEFILE
7、統計當前系統上所有tcp連接的各種狀態的個數
# ss -tan | awk '!/^State/{state[$1]++}END{for(i in state){print i,state[i]}}'
8、統計指定的web訪問日志中各ip的資源訪問次數
awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/httpd/wp.access
9、寫一個腳本:定義一個數組,數組元素為/var/log目錄下所有以.log結尾的文件的名字;顯示每個文件的行數
# vim logcount.sh #!/bin/bash # declare -a rows declare -a FileNames for i in /var/log/*.log; do rows=$(cat $i | wc -l) FileNames=${i##*/} printf "%-30s %s\n" $FileNames $rows done # bash -n logcount.sh # bash logcount.sh boot.log 236 vmware-vmsvc.log 413 vmware-vmusr.log 21 wpa_supplicant.log 19 Xorg.0.log 404 yum.log 723
10、寫一個腳本,能從所有同學中隨機挑選一個同學回答問題;進一步地:可接受一個參數,做為要挑選的同學的個數
#!/bin/bash # declare -a Students Students=(Jose David Antonio Eric Victor Luke Ander Paul Michael Lukaku Mkhitaryan Rashford) read -p "Please chose a number [1-${#Students[@]}]: " num if [[ $num -lt 1 || $num -gt 12 ]];then echo -e "An error choise!\nPlease chose from 1-${#Students[@]}" exit 2 else for ((i=0;i<$num;i++)) do x=$[$RANDOM % ${#Students[@]}] echo ${Students[$x]} Students[$x]=${Students[${#Students[@]}-1]} unset Students[${#Students[@]}-1] done fi # bash students.sh Please chose a number [1-12]: 4 Eric Ander Lukaku Antonio
11、授權centos用戶可以運行fdisk命令完成磁盤管理,以及使用mkfs或mke2fs實現文件系統管理
# visudo centos ALL=(root) /sbin/fdisk, /sbin/mkfs, /sbin/mke2fs
12、授權gentoo用戶可以運行邏輯卷管理的相關命令
# visudoCmnd_Alias LVADMINS_CMD=/sbin/lvchange,/sbin/lvdisplay,/sbin/lvmchange,/sbin/lvmdiskscan,/sbin/lvmsadc,/sbin/lvremove,/sbin/lvs,/sbin/lvconvert,/sbin/lvextend,/sbin/lvmconf,/sbin/lvmdump,/sbin/lvmsar,/sbin/lvrename,/sbin/lvscan,/sbin/lvcreate,/sbin/lvm,/sbin/lvmconfig,/sbin/lvmetad,/sbin/lvreduce,/sbin/lvresize,/sbin/pvchange,/sbin/pvck,/sbin/pvcreate,/sbin/pvdisplay,/sbin/pvmove,/sbin/pvremove,/sbin/pvresize,/sbin/pvs,/sbin/pvscan,/sbin/vgcfgbackup,/sbin/vgck,/sbin/vgdisplay,/sbin/vgimport,/sbin/vgmknodes,/sbin/vgrename,/sbin/vgsplit,/sbin/vgcfgrestore,/sbin/vgconvert,/sbin/vgexport,/sbin/vgimportclone,/sbin/vgreduce,/sbin/vgs,/sbin/vgchange,/sbin/vgcreate,/sbin/vgextend,/sbin/vgmerge,/sbin/vgremove,/sbin/vgscan gentoo ALL=(ALL) NOPASSWD:LVADMINS_CMD
13、基于pam_time.so模塊,限制用戶通過sshd服務遠程登錄只能在工作時間進行
# vim /etc/pam.d/sshd account required pam_time.so # vim /etc/security/time.conf sshd;*;*;MoTuWeThFr0900-1800
14、基于pam_listfile.so模塊,定義僅某些用戶,或某些組內的用戶可登錄系統
# vim /etc/user_list centos fedora # chmod 600 /etc/sshd_userlist # vim /etc/pam.d/sshd auth required item=user sense=allow file=/etc/users onerr=succeed
原創文章,作者:浙江-咲,如若轉載,請注明出處:http://www.www58058.com/80423
sed, awk在手,天下我有,加油。