Linux GNU AWK使用
本章內容:
awk介紹
awk基本用法
awk變量
awk格式化
awk操作符
awk條件判斷
awk循環
awk數組
awk函數
調用系統命令
文本處理三工具: grep、sed、awk
grep:文本過濾工具;
sed:行編輯器;
awk:報告生成器,格式化文本輸出;
awk:Aho Weinberger Kernighan,報告生成器,格式化文本輸出。
awk:有多重版本:New awk (nawk) GNU awk (gawk)。
gawk – 模式掃描和處理語言。
gawk [ POSIX or GNU style options ] -f program-file [ — ] file …
gawk [ POSIX or GNU style options ] [ — ] program-text file …
pgawk [ POSIX or GNU style options ] -f program-file [ — ] file …
pgawk [ POSIX or GNU style options ] [ — ] program-text file …
awk程序通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊,共3部分組成。
program:通常使用單引號(’’)把{}引起來。
awk基本用法:
gawk [option] ‘program’ FILE…….
program:PATTERN{ACTION STATEMENTS} 語句之間用分號分隔;
選項:
-F:指明輸入時用到的字段分隔符;默認以空白作為分隔符。
-v:var=value 自定義變量。
print: item=字段的意思。
(1)多個item之間使用“,”逗號分隔。
(2)輸出的各item可以是字符,也可以是數值,變量或awk的表達式。
(3)如果省略item($1…)相當于print $0 整行的內容。
printf:可以調整文本的寬度,間隔等,比print功能要強。
分隔符、域和記錄:
awk執行時,由分隔符分隔的字段(域)標記$1 $2 …..$n稱為域標識。$0為所有域,代表整個文件。
注意:awk中的$符和shell中的$符含義是不同的。
文件的每一行稱為記錄。
省略action,則默認執行print $0 的操作。
awk的工作原理:
第一步:執行BEGIN{action;…..}語句塊中的語句。
示例:
[root@centos6 Desktop]# awk 'BEGIN{print "hello world"}'
hello world
[root@centos6 Desktop]#
第二部:從文件或標準輸入(stdin)讀取一行,然后執行pattern{action;…..}語句塊,它逐行掃描文件,從第一行到最后一行重復這個過程,直到文件全部被讀取完畢。
示例:
[root@centos6 Desktop]# awk -F: '{print "username:"$1”\t”"uid:"$3}' /etc/passwd
username:root uid:0
username:bin uid:1
username:daemon uid:2
username:adm uid:3
………………………………
[root@centos6 Desktop]#
第三部:當讀取完文件時,執行END{action….}語句塊。
BEGIN語句塊在awk開始讀取文件行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通??梢詫懺?/span>BEGIN語句塊中。
END語句塊在awk讀取完文件行之后被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選的語句塊。
pattern語句塊中的通用命令是最重要的部分,也是可選的。如果沒有提供pattern語句塊,則默認執行{print},即完整打印每一個讀取到的行,awk讀取到的每一行都會執行該語句塊。
-v選項的變量:
(1)內建變量:input
FS:指明列分隔符,(類似于cut中的f),默認以空白字符作為分隔符。
[root@centos6 ~]# awk -v FS=":" '{print $1}' /etc/passwd
OFS:指明輸出字段的分隔符,默認以空白字符作為分隔符。
[root@centos6 ~]# awk -v FS=":" -v OFS="=" '{print $1,$3,$6}' /etc/passwd
RS:指明換行分隔符,指定輸入時的換行符,原換行符仍有效。
awk -v RS=" " '{print}' /etc/passwd
ORS:指明以什么代替回車換行符,輸出時用指定的符號代替換行符。
awk -F: -v ORS="########" '{print $1,$2 }' /etc/passwd
root x##############bin x##############daemon x
NF:顯示每行的字段總數。
1、
[root@centos6 Desktop]# awk -F: '{print NF}' /etc/passwd
7
7
7
……………………….
[root@centos6 Desktop]#
2、
[root@centos6 Desktop]# awk -F: '{print $(NF-6)}' /etc/passwd
root
bin
daemon
[root@centos6 Desktop]#
NR:顯示行號。
1、
[root@centos6 Desktop]# awk -F: '{print NR,$1}' /etc/passwd
1 root
2 bin
3 daemon
4 adm
[root@centos6 Desktop]#
2、
[root@centos6 Desktop]# awk -F: END'{print NR,$1}' /etc/passwd
38 named
[root@centos6 Desktop]#
FNR:各文件分別計數,統計行號。
[root@centos6 Desktop]# awk '{print FNR, $0}' /etc/issue /etc/issue
1 CentOS release 6.8 (Final)
2 Kernel \r on an \m
3
1 CentOS release 6.8 (Final)
2 Kernel \r on an \m
3
[root@centos6 Desktop]#
FILENAME:顯示當前文件名。
[root@centos6 Desktop]# awk '{print FILENAME, $0}' /etc/issue
/etc/issue CentOS release 6.8 (Final)
/etc/issue Kernel \r on an \m
/etc/issue
[root@centos6 Desktop]#
ARGC:顯示命令行參數的個數。
[root@centos6 Desktop]# awk BEGIN'{print ARGC}' /etc/fstab /etc/issue
3
[root@centos6 Desktop]#
ARGV:數組,保存的是命令行所給定的各參數。
0、
[root@centos6 Desktop]# awk '{print ARGV[0]}' /etc/fstab /etc/issue
awk
1、
[root@centos6 Desktop]# awk '{print ARGV[1]}' /etc/fstab /etc/issue
/etc/fstab
2、
[root@centos6 Desktop]# awk '{print ARGV[2]}' /etc/fstab /etc/issue
/etc/issue
(2)自定義變量:
(1)-v var=value (變量名區分字符大小寫)
(2)在program中直接定義
示例:
1、 [root@centos6 ]# awk -F: -v name=username '{print name,$1 }' /etc/passwd
username root
username bin
username daemon
………………………………..
2、[root@centos6 ]# awk -F: '{name="username";print name,$1}' /etc/passwd
username root
username bin
username daemon
………………………………..
printf命令:
格式化輸出:printf “FORMAT”,item1,item2
(1)必須指定FORMAT。
(2)不會自動換行,需要顯示給出換行控制符,\n。
(3)FORMAT中需要分別為后面每個item指定格式符。
格式符:與item一一對應:
%c:顯示字符的ASCII碼;
%d,%i:顯示十進制整數;
%e,%E:顯示科學計數法數值;
%f:顯示為浮點數;
%g,%G:以科學計數法或浮點形式顯示數值;
%s:顯示字符串;
%u:無符號整數;
%%:顯示%本身;
修飾符:
#[.#]:第一個數字控制顯示的寬度,第二個#表示小數點后精度,例:%3.1f
–:左對齊(默認右對齊)%-10s
+:顯示數值的正負符號%+10d
示例:
1、 以右對齊20個字打印/etc/passwd的第一個字段,以左對齊10個字符打印/etc/passwd的第二個字段。
[root@centos6 ]# awk -F: '{printf "%20s======== %-10d\n" ,$1,$2}' /etc/passwd
root======== 0
bin======== 0
daemon======== 0
adm======== 0
2、
[root@centos6 ]# awk -F: '{printf "nameuser:%-15s===== uid:%d\n",$1,$3}' /etc/passwd
nameuser:root ===== uid:0
nameuser:bin ===== uid:1
nameuser:daemon ===== uid:2
算數操作符:
+(加)、–(減)、*(乘)、/(除)、^(次冪)、%(取模運算)
示例:
[root@centos6 Desktop]# awk BEGIN'{print 10^10}'
10000000000
[root@centos6 Desktop]#
賦值操作符:
=、+=、-=、*=、/=、%=、%=、++、—
示例:
[root@centos6 ~]# awk -v i=1 BEGIN'{print i+=5}'
6
[root@centos6 ~]# awk -v i=1 BEGIN'{print i*=5}'
5
[root@centos6 ~]# awk -v i=10 BEGIN'{print i/=5}'
2
[root@centos6 ~]# awk -v i=10 BEGIN'{print i++}'
10
[root@centos6 ~]# awk -v i=10 BEGIN'{print ++i}'
11
[root@centos6 ~]# awk -v i=10 BEGIN'{print –i}'
9
[root@centos6 ~]# awk -v i=10 BEGIN'{print i++,i}'
10 11
[root@centos6 ~]#
比較操作符:
> 、>= 、< 、<=、!=、==
示例:
1、[root@centos6 ~]# awk -F: '$3<=2 {print $1}' /etc/passwd
root
bin
daemon
[root@centos6 ~]#
2、[root@centos6 ~]# awk -F: '$3>0 {print $1,$3}' /etc/passwd
3、[root@centos6 ~]# awk -F: '$3==0 {print $1}' /etc/passwd
root
[root@centos6 ~]#
4、[root@centos6 ~]# awk -F: '$3>0 && $3<5{print $1}' /etc/passwd
bin
daemon
adm
lp
[root@centos6 ~]#
模式匹配符:
~:左邊匹配包含右邊的全部顯示出來;
!~:左邊和右邊不匹配的全部顯示;
示例:
1、行中包括root字符的全部顯示出來。
[root@centos6 ~]# awk '$0~"root"{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[ root@centos6 ~]#
2、除了上面兩行顯示的內容,都顯示出來。
[root@centos6 ~]# awk '$0!~"root"{print $0}' /etc/passwd
3、在/etc/passwd中第一字段包含以root開頭的顯示出來。
[root@centos6 ~]# awk -F: '$1~"^root"{print $1}' /etc/passwd
root
[root@centos6 ~]#
邏輯操作符: 與&& 或|| 非!
示例:
1、[root@centos7 Desktop]# awk -F: '$3==0 || $3==1000{print $1}' /etc/passwd
root
zheng
[root@centos7 Desktop]#
2、[root@centos7 Desktop]# awk -F: '$3>0 && $3<=5{print $1}' /etc/passwd
bin
daemon
adm
lp
sync
[root@centos7 Desktop]#
3、[root@centos7 Desktop]# awk -F: '!($3>0){print $1}' /etc/passwd
root
[root@centos7 Desktop]#
條件表達式:(三目表達式):
selector?if-true-expression:if-false-xepression
示例:
[root@centos7]#awk-F:'$3>1000?username="commonuser":username="sysuser"{printf "%-20s %-10s===== %d\n",username, $1,$3}' /etc/passwd
awk pattern:
pattern:根據pattern條件,過濾匹配到的行,在做處理。
(1)如果未指定pattern:空模式,匹配每一行。
(2)/regular expression/:僅處理能夠匹配到的行,需要用/ /括起來。
(3)/regular expression/:關系表達式,結果有“真”有“假”,結果為“真”才會被處理。
真:結果為非0值,非空字符串;
假:結果為空字符串或0值;
(4)line ranges:行范圍。
startline,endline:/pattern1/,/pattern2/不支持直接給出數字格式。
(5)BEGINEND模式:
BEGIN{}:僅在開始處理文件中的文本之前執行一次。
END:僅在文本處理完成之后執行一次。
示例:
1、[root@centos7 Desktop]# awk '/^UUID/{printf "%s\n", $1}' /etc/fstab
UUID=2de5de7c-8ba6-4ce3-a56f-71ddc0e51765
UUID=fe32016e-a798-4b03-91a1-55adfd9a4355
UUID=f51b97fa-1ced-4ef0-9635-3d6d8f6feb5e
UUID=2bb4030e-68e8-4640-a3ac-62b98c029967
[root@centos7 Desktop]#
2、取反:[root@centos7 Desktop]# awk '!(/^UUID/){printf "%s\n", $0}' /etc/fstab
3、[root@centos7 Desktop]# awk '!0' /etc/passwd (為“真”可以打印/etc/passwd文件)
4、[root@centos7 Desktop]# awk '!1' /etc/passwd(為“假”不進行打印)
[root@centos7 Desktop]#
5、[root@centos7 Desktop]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
zheng /bin/bash
yibo /bin/bash
mage /bin/bash
[root@centos7 Desktop]#
示例:line ranges:行范圍。
1、[root@centos7 Desktop]# awk -F: '/^root\>/,/^adm\>/{print $1}' /etc/passwd
root
bin
daemon
adm
[root@centos7 Desktop]#
2、[root@centos7 Desktop]# awk -F: 'NR>=10&&NR<=15{print $1}' /etc/passwd
operator
games
ftp
nobody
dbus
polkitd
[root@centos7 Desktop]#
示例:BEGIN/END模式:
[root@centos7 Desktop]# awk -F: 'BEGIN{print "username uid"}NR>=10&&NR<=20{printf "%-15s========= %-10d\n",$1,$3}END{print "end file"}' /etc/passwd
awk奇數偶數總結:
示例:
[root@centos7 Desktop]# seq 2 | awk 'i=0'
[root@centos7 Desktop]# seq 2 | awk 'i=1'
1
2
[root@centos7 Desktop]# seq 2 | awk 'i=!i'
1
[root@centos7 Desktop]# seq 2 | awk '!(i=!i)'
2
[root@centos7 Desktop]# seq 4 | awk '{i=!i;print i}'
1
0
1
0
[root@centos7 Desktop]#
使用awk取文件的奇數行:
示例:
[root@centos7 Desktop]# awk 'NR%2{print NR,$1}' /etc/fstab
1
3 #
5 #
7 #
9 UUID=2de5de7c-8ba6-4ce3-a56f-71ddc0e51765
11 UUID=f51b97fa-1ced-4ef0-9635-3d6d8f6feb5e
13 /dev/sdb1
[root@centos7 Desktop]#
使用awk取文件的偶數行:
示例:
[root@centos7 Desktop]# awk '!(NR%2){print NR,$1}' /etc/fstab
2 #
4 #
6 #
8 #
10 UUID=fe32016e-a798-4b03-91a1-55adfd9a4355
12 UUID=2bb4030e-68e8-4640-a3ac-62b98c029967
[root@centos7 Desktop]#
awk action:
常用的action分類:
(1)expressions:算術,比較表達式;
(2)control statements:if,while等;
(3)compound statements:組合語句;
(4)input statements
(5)output statement:print;
awk控制語句if-else
語法:{if(condition)statement [else statememt]}
{if(condition1){statement1}else if (condition2){statement2} else{statement3}}
示例:
1、查找/etc/passwd文件,如果$3是大于等于1000的行,然后打印$1、$3。
[root@centos7 ~]# awk -F: '{if($3>=1000){print $1,$3}}' /etc/passwd
nfsnobody 65534
zheng 1000
yibo 1001
mage 1002
[root@centos7 ~]#
2、查找/etc/passwd文件中,如果$7段中等于/bin/bash,然后打印$1S。
[root@centos7 ~]# awk -F: '{if($NF=="/bin/bash"){print $1}}' /etc/passwd
root
zheng
yibo
mage
[root@centos7 ~]#
3、查找出/etc/fstab文件中字段數大于5的行;
[root@centos7 ~]# awk '{if(NF>5){print $0}}' /etc/fstab
4、查找/etc/passwd文件中,如果$3大于等于1000,則打印common user并打印$1,否則打印root or sysuser 并打印$1。
[root@centos7 ~]# awk -F: '{if($3>=1000){printf "common user:%s\n",$1}else {printf "root or sysuser: %s\n",$1}}' /etc/passwd
5、使用awk中的if、else if、else判斷語句:
awk -v test=100 'BEGIN{print test;if(test>90){print "very good"}else if(test>70){print "good"}else {print "no pass"}}' (因為代碼后沒有別的參數了,說以前面要執行BEGIN)
awk 控制語句while循環:
語法 {while(condition){statement}}
條件為“真”進入循環,條件“假”退出循環;
使用場景:
對行內的多個字段行逐一處理時使用;
對數組中的各元素逐一處理時使用;
示例:
1、使用while循環打印出/etc/grub2.cfg中的,以空格linux16開頭的行的字段和字段的字符長度。
awk '/^[[:space:]]+linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg
2、使用while循環打印出/etc/grub2.cfg中的,以空格linux16開頭的行的字段和字段的字符長度大于等于10的。
awk '/^[[:space:]]+linux16/{i=1;while(i<=NF){if(length($i)>=10)print $i,length($i);i++}}' /etc/grub2.cfg
awk控制語句do-while循環:
語法:do{statement}while(condition)
意義:無論真假,至少執行依次循環體。
示例:
1、使用do-while語句執行1加到100的sum。
awk 'BEGIN{sum=0;i=0;do{sum+=i;i++;print i,sum}while(i<=100){print sum}}'
2、測試執行命令花費的時間:
[root@centos7]# time awk 'BEGIN{sum=0;i=0;do{sum+=i;i++;print i,sum}while(i<=100){print sum}}'
awk 控制語句for循環:
語法:for(expr1;expr2;expr3){statement}
特殊用法:能夠遍歷數組中的元素;
示例:使用for循環打印出/etc/grub2.cfg中的,以空格linux16開頭的行的字段和字段的字符長度。
awk '/^[[:space:]]+linux16/{for(i=1;i<=NF;i++){print $i,length($i)}}' /etc/grub2.cfg
性能比較:
可以使用time命令測試一條命令執行的時間長短:
示例:測試seq 1加到100所用的時間;
[root@centos7 Desktop]# time seq -s "+" 100 >> /dev/null |bc
real 0m0.006s
user 0m0.001s
sys 0m0.008s
[root@centos7 Desktop]#
awk 控制語句 switch語句:
語法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}
break和continue以及next的用法:
示例:
1、計算100以內所有奇數的和。
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0){continue}sum+=i;print sum}}'
2、計算1到50的和:
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i>50){break}sum+=i;print sum}}'
3、打印/etc/passwd文件中的偶數行:
[root@centos7 Desktop]# awk -F: '{if($3%2!=0)next;print $1,$3}' /etc/passwd
awk數組:
(1)可以使用任意字符串,字符串要使用雙引號括起來。
(2)如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空”。
(3)若要判斷數組中是否存在某元素,要使用”index in array”格式進行遍歷。
(4)若要遍歷數組中的每個元素,要使用for循環。
示例:
1、創建數組并打印數組中的某個元素。
awk 'BEGIN{jiaotong["a"]="huoche";jiaotong["b"]="feiji";jiaotong["3"]="qiche";print jiaotong["3"]}'
2、去除文件中重復的行:
awk ‘!arr[$0]++’ file
3、遍歷數組中的每個元素。
# awk 'BEGIN{jiaotong["a"]="huoche";jiaotong["b"]="feiji";jiaotong["3"]="qiche";print jiaotong["3"];for(i in jiaotong)print jiaotong[i]}'
qiche
huoche
feiji
qiche
[root@centos7 Desktop]#
4、查看文件中每行重復出現的次數。
[root@centos7 ~]# awk '{!stat[$0]++}END{for(i in stat)print i,stat[i]}' f1
aaaa 2
11111111 2
bbbbbbbbbb 2
cmslcml, 1
[root@centos7 ~]#
[root@centos7 ~]# cat f1 |uniq -c
2 aaaa
2 bbbbbbbbbb
2 11111111
1 cmslcml,
[root@centos7 ~]#
5、查看/var/log/httpd/access_log文件中IP地址鏈接的次數。
[root@centos6 Desktop]# awk '{stat[$1]++}END{for(i in stat)print i,stat[i]}' /var/log/httpd/access_log
10.1.252.238 3
[root@centos6 Desktop]#
awk '{line[$0]++}END{for(i in line)print i ,line[i]}' /etc/fstab
awk 函數:
數值處理:
rand():返回0和1之間一個隨機數;
srand():隨機數種子;
int:整數;
示例:
1、生成5個100以內隨機的5個整數;
[root@centos7 ~]# awk 'BEGIN{srand();for(i=1;i<=5;i++)print int(rand()*100)}'
26
50
21
95
59
[root@centos7 ~]#
length():返回指定字符串的長度。
sub(r,s):搜索r表示的模式匹配的內容,并將第一個匹配的內容替換為s。
示例:sub只替換搜索到的第一個匹配的內容。
[root@centos7 ~]# echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-")'
2008-08:08 08:08:08
[root@centos7 ~]#
gsub(r,s):搜索r表示的模式匹配的內容,并全部替換為s所表示的內容。
示例:
[root@centos7 ~]# echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-")'
2008-08-08 08-08-08
[root@centos7 ~]#
split(s,array,“r”):以r代表分隔符,切割字符s,并將切割后的結果保存至array所表示的數組中,第一個索引值為1,第二個索引值為2………
示例:
[root@centos7 ~]# echo "2008:08:08 08:08:08" | awk 'split($0,num,":"){print num[1]}'
2008
[root@centos7 ~]# echo "2008:08:08 08:08:08" | awk 'split($0,num,":"){print num[3]}'
08 08
[root@centos7 ~]#
# netstat -tan | awk '/^tcp/{split($5,ip,":");print ip[1];counts[ip[1]]++}END{for(i in counts){print i ,counts[i] }}'
awk中調用shell命令:
system命令:
空格是awk中的字符串鏈接符,如果system中需要使用awk中的變量可以使用空格分隔,或者說除了awk的變量外其他一律用“”應用起來。
示例:
[root@centos7 ~]# awk 'BEGIN{system("hostname")}'
centos7
[root@centos7 ~]# awk 'BEGIN{test=100;system("echo " test)}'
100
[root@centos7 ~]#
awk腳本:
將awk程序寫成腳本,直接調用執行。
[root@centos7 bin]# cat uid.awk
#!/bin/awk -f
#this is a awk scripts
{if($3>=1000)print $1,$3}
[root@centos7 bin]# uid.awk -F: /etc/passwd
nfsnobody 65534
zheng 1000
yibo 1001
mage 1002
[root@centos7 bin]#
向awk腳本中傳遞參數:
[root@centos7 bin]# cat uid.awk
#!/bin/awk -f
#this is a awk scripts
{if($3>=min && $3<=max)print $1,$3}
[root@centos7 bin]# uid.awk -F: min=100 max=200 /etc/passwd
usbmuxd 113
rtkit 172
qemu 107
abrt 173
avahi-autoipd 170
pulse 171
[root@centos7 bin]#
練習:
1、統計/etc/fstab文件中每個單詞出現的次數:
[root@centos7 bin]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}' /etc/fstab
2、統計/etc/fstab文件中每個文件系統類型出現的次數:
[root@centos7 bin]# awk '/^UUID/{fs[$3]++}END{for(i in fs)print i,fs[i]}' /etc/fstab
swap 1
xfs 3
[root@centos7 bin]#
示例:
使用awk的“-F”選項指明以“:”作為列分隔符,取出/etc/passwd中第一個字段
[root@centos6 ~]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
……………………………….
[root@centos6 ~]#
使用awk的“-v”選項指明以“:”作為列分隔符,取出/etc/passwd中第一個字段
[root@centos6 ~]# awk -v FS=":" '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
……………………………….
[root@centos6 ~]#
使用awk的“-v”選項指明以“:”作為列分隔符,輸出時指定以“=”作為列分隔符,取出/etc/passwd中第一、第三、第六個字段等。
[root@centos6 ~]# awk -v FS=":" -v OFS="=" '{print $1,$3,$6}' /etc/passwd
root=0=/root
bin=1=/bin
daemon=2=/sbin
adm=3=/var/adm
lp=4=/var/spool/lpd
……………………………….
[root@centos6 ~]#
示例:
RS:指明行的換行分隔符,指定輸入時的換行符,原換行符仍有效。
[root@centos6 ~]# awk -v RS=" " '{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP
User:/var/ftp:/sbin/nologin
……………………………….
[root@centos6 ~]#
原創文章,作者:zhengyibo,如若轉載,請注明出處:http://www.www58058.com/49777