歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> shell_05變量名、意義

shell_05變量名、意義

日期:2017/3/1 16:15:22   编辑:SHELL編程
shell_05變量名、意義 變量名 意義 $n 當前記錄的第n個域,域間由FS分割 $0 記錄的所有域 ARGC 命令行參數的數量 ARGIND 命令行中當前文件的位置(以0開始標號) ARGV 命令行參數的數組 CONVFMT 數字轉換格式 ENVIRON 環境變量關聯數組 ERRNO 最後一個系統錯誤的描述 FIELDWIDTHS 字段寬度列表,以空格鍵分割 FILENAME 當前文件名 FNR 浏覽文件的記錄數 FS 字段分隔符,默認是空格鍵 IGNORECASE 布爾變量,如果為真,則進行忽略大小寫的匹配 NF 當前記錄中的域數量 NR 當前記錄數 OFMT 數字的輸出格式 OFS 輸出域分隔符,默認是空格鍵 ORS 輸出記錄分隔符,默認是換行符 RLENGTH 由match函數所匹配的字符串長度 RS 記錄分隔符,默認是空格鍵 RSTART 由match函數所匹配的字符串的第1個位置 SUBSEP 數組下標分隔符,默認值是\034 netstat -ntulp |grep -v "Active" |grep -v "Proto"|sed 's/\//:/g' |sed "s/\./:/g"| sed "s/fe80\:\://g" |awk -F':| +' '{print $1"\t"$8"\t"$13"\t"$15"\t"$16}' |head -30 awk的概述: awk是一種編程語言,軟件級別等同於bash,主要用於在linux/unix下對文本和數據進行處理。數據可以來自標准輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更多是作為腳本來使用。awk的處理文本和數據的方式是這樣的,它逐行掃描文件,默認從第一行到最後一行,尋找匹配的特定模式的行,並在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標准輸出(屏幕),如果沒有指定模式,則所有被操作所指定的行都被處理。awk分別代表其作者姓氏的第一個字母。因為它的作者是三個人,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴展。下面介紹的awk是以GNU的gawk為例的,在linux系統中已把awk鏈接到gawk,所以下面全部以awk進行介紹。 awk命令兩種使用方式: 1)命令模式 awk [options] 'commands' file(s) command 部分:/范圍說明/{awk命令語句1;awk命令語句2;} 范圍說明部分可以是BEGIN、END、邏輯表達式或者為空 awk命令語句間用分號間隔 引用shell 變量需用雙引號引起 option 部分 -F 定義字段分割符號 2)腳本模式 awk [options] -f scriptfile file(s) 特點: awk腳本是awk命令的清單 命令需要用分號間隔 #號開頭的是注釋行 字段及分割 awk 用$1,$2,$3...$n等的順序形式表示files中每行以間隔符號分割的各列的不同字段 $0表示行本身 awk默認以空格符為間隔符號將每行分割為單獨的字段,也可以使用awk內置變量FS定義間隔符號 awk 使用option中的-F參數定義默認間隔符號 NF變量表示當前記錄的字段數(列數) $NF 最後一列 $(NF-1) 倒數第二列 FNR/NR 行號 FILENAME 文件名 "\t" 制表符 RS 換行符 "" 打印字符串 # awk 'BEGIN {FS=":"} {print $1}' /etc/passwd $ head -5 /etc/passwd > passwd $ awk -F':' '{print FILENAME,FNR,NF,$1,$2,$3,$4,$5,$6,$7,"\t"$0}' ./passwd ./passwd 1 7 root x 0 0 root /root /bin/bash root:x:0:0:root:/root:/bin/bash ./passwd 2 7 bin x 1 1 bin /bin /sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin ./passwd 3 7 daemon x 2 2 daemon /sbin /sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ./passwd 4 7 adm x 3 4 adm /var/adm /sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin ./passwd 5 7 lp x 4 7 lp /var/spool/lpd /sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 打印所有行 $ cat passwd $ awk -F':' '{print $0}' passwd $ awk -F':' '{print}' passwd 取倒數第一列和倒數第二列 $ head -1 passwd |awk -F':' '{print $NF,$(NF-1)}' /bin/bash /root 換行符(默認處理一行後才換行) $ head -1 passwd |awk -F':' '{print $NF RS $(NF-1)}' /bin/bash /root $head -1 passwd | awk 'BEGIN {FS=":"} {print $NF RS $(NF-1)}' 一次指定多個分隔符 $ awk -F':|/' '{print NF}' passwd $ awk -F'[:/]' '{print NF}' passwd $ ifconfig eth0|grep Bcast|awk -F':| +' '{print $4}' $ifconfig eth0 |grep Bcast | awk -F" " '{print $2}'|awk -F":" '{print $2}' 定址: 1)關鍵字 BEGIN :表示在程序開始前執行 END :表示所有文件處理完後執行 操作流程: #/bin/awk -f BEGIN {} --讀前處理(讀取目標文件) {} --行處理 END {} --讀後處理 打印標題和結尾信息 $ awk -F':' 'BEGIN {print "user\tpasswd\thome"RS"----------------------"} ; {print $1"\t"$2"\t"$(NF-1)} ; END {print "<-----------END---------->"}' passwd user passwd home ---------------------- root x /root bin x /bin daemon x /sbin adm x /var/adm lp x /var/spool/lpd <-----------END----------> 2)正則表達式 $ awk '/root/ {print $0}' /etc/passwd --使用普通字符定位 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin $ awk '$0 ~ /^root/ {print $0}' /etc/passwd --使用正則表達式定位 root:x:0:0:root:/root:/bin/bash $ awk '/^[rR]oot|^[bB]in/ {print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin # awk -F':' '/^[rR]oot|^[bB]in/ {print $1}' passwd 使用正則表達式精確定位 $ awk -F':' '$2=="" {print $0}' /etc/passwd $ awk -F':' '$2=="" {print $0}' /etc/shadow --查看用戶中有無空密碼的 $ awk -F':' '$7 ~ /bash$/ {print $0}' /etc/passwd $ awk -F':' 'NR>=5 && NR<=10 {print $0}' /etc/passwd $ awk '/^root/,/^uucp/ {print $0}' /etc/passwd 3)邏輯表達式 例如:NR>40 例如:if ( $2>50) { print $3 } 邏輯表達式: ==(等於)、!=(不等於)、>(大於)、<(小於)、>=(大於等於)、<=(小於等 於) ~(匹配於)和!~(不匹配於) !(非)、&&(與)、||(或)、和括號() awk -F: 'NR<10 && NR>3 {print $0} ' /etc/passwd --與 awk -F: 'NR==10 || NR==3 {print NR,$0} ' /etc/passwd --或 awk -F: '!(NR<40) {print NR,$1}' /etc/passwd --取反 awk -F: '$3>=500 && $3 <=60000 {print $3,$1}' /etc/passwd --打印普通用戶 awk -F: 'NR%2==0 {print NR,$0}' /etc/passwd -- 取偶數 awk -F: 'NR%2!=0 {print NR,$0} ' /etc/passwd --打印奇數行 awk -F: 'NR%2==1 {print NR,$0}' /etc/passwd awk -F":" 'BEGIN {print "user_UID\tusername\t"RS"-------------------"}; ($3>=500 && $3<=60000) {print $3"\t","\t"$1} ; END {print "--------------------"}' /etc/passwd awk的流程控制 if for while if(expr1) action if(expr1) action2;else aciton2 if(expr1) action1;else if(expr2);else # awk -F: '{if($3>500) print $1,$3,"普通用戶"}' /etc/passwd # awk -F: '{if($3>500) print $1,$3,"普通用戶";else print $1,$3,"不是普通用戶"}' /etc/passwd # awk -F: '{if($3==0) print $1,$3,"管理員";else if($3<500) print $1,$3,"系統用戶";else print $1,$3,"普通用戶"}' /etc/passwd for # awk 'BEGIN {for(i=0; i<=10; i++) print i}' while # awk 'BEGIN {i=0;while(i<=5) {print i;i++}}' # awk 'BEGIN {i=0;while(i<=5) {print"service",i,"start";i++}}' #循環的控制: break --條件滿足的時候中斷循環 continue --條件滿足的時候跳過循環 # awk 'BEGIN {i=0;while(i<=5) {i++;if(i==3) continue; print i}}' # awk 'BEGIN {i=0;while(i<=5) {i++;if(i==3) break; print i}} 用netstat -ntl 截取所有開放的端口號 netstat -ntl |grep -v Active| grep -v Proto|awk '{print $4}'|awk -F: '{print $NF}' netstat -ntlup |grep -Ev "Active|Proto" |awk '{print $4}' |awk -F: '{print $NF}'
Copyright © Linux教程網 All Rights Reserved