一日丹、簡(jiǎn)述systemd的新特性及unit常見(jiàn)類型分析,能夠?qū)崿F(xiàn)編譯安裝的如nginx\apache實(shí)現(xiàn)通過(guò)systemd來(lái)管理
Systemd概述
1.systemd是一種新的linux系統(tǒng)服務(wù)管理器逢防,用于替換init系統(tǒng)芦岂,能夠管理系統(tǒng)啟動(dòng)過(guò)程和系統(tǒng)服務(wù)寒锚,一旦啟動(dòng)起來(lái),就將監(jiān)管整個(gè)系統(tǒng)乓旗。在centos7系統(tǒng)中府蛇,PID1被systemd所占用;
2.systemd可以并行地啟動(dòng)系統(tǒng)服務(wù)進(jìn)程屿愚,并且最初僅啟動(dòng)確實(shí)被依賴的服務(wù)汇跨,極大減少了系統(tǒng)的引導(dǎo)時(shí)間,這也就是為什么centos7系統(tǒng)啟動(dòng)速度比centos6快許多的原因妆距;
3.systemctl 是 systemd 的主命令穷遂,用于管理系統(tǒng)及服務(wù)
systemd的新特性:
- 在系統(tǒng)引導(dǎo)時(shí)實(shí)現(xiàn)服務(wù)并行啟動(dòng);
- 能按需激活進(jìn)程娱据;
- 能做系統(tǒng)狀態(tài)快照蚪黑;
- 基于依賴關(guān)系定義服務(wù)控制邏輯;
關(guān)鍵特性:(了解systemd的工作)
- 基于socket的激活機(jī)制:socket與程序分離中剩;
- 基于bus的激活機(jī)制忌穿;
- 基于設(shè)備device的激活機(jī)制:
能監(jiān)控內(nèi)核輸出的硬件信息,當(dāng)設(shè)備插入時(shí)一旦發(fā)現(xiàn)就創(chuàng)建設(shè)備文件结啼,再自動(dòng)掛載至某掛載點(diǎn)掠剑,如果掛載點(diǎn)不存在還能自動(dòng)創(chuàng)建
- 基于path的激活機(jī)制:
系統(tǒng)可監(jiān)控某目錄或文件是否存在,如果文件在了立即就能激活一個(gè)服務(wù)或進(jìn)程郊愧;例如某服務(wù)運(yùn)行中突然崩潰朴译,崩潰時(shí)能創(chuàng)建一個(gè)log或lock文件井佑;一旦發(fā)現(xiàn)這個(gè)lock文件立即激活一個(gè)程序如發(fā)送報(bào)告
- 系統(tǒng)快照:
能保存各unit的當(dāng)前狀態(tài)信息于持久存儲(chǔ)設(shè)備中; 因?yàn)閟ystemd的所有管理都是通過(guò)unit實(shí)現(xiàn)的眠寿,回滾時(shí)使用
- 向后兼容sysv init腳本:
所以放在/etc/init.d/服務(wù)腳本也一樣能靠systemd來(lái)啟動(dòng)
不兼容:
- systemctl的命令是固定不變的躬翁;
不能自定義命令,舊版能自定義如start澜公、stop等命令姆另,在腳本中可隨意定義命令使用喇肋;而systemctl的命令是固定不變的
- 非由systemd啟動(dòng)的服務(wù)坟乾,systemctl無(wú)法與之通信,無(wú)法控制此服務(wù)蝶防;
例如啟動(dòng)web進(jìn)程httpd甚侣,直接在命令行鍵入httpd也能啟動(dòng),這種服務(wù)在CentOS 5和6上使用servcie httpd stop有時(shí)也能停掉服務(wù)间学,但是systemd就不行殷费,但可自定義unit腳本來(lái)實(shí)現(xiàn)
systemd核心概念:unit
unit由其相關(guān)配置文件進(jìn)行標(biāo)識(shí)、識(shí)別和配置低葫;文件中主要包含了系統(tǒng)服務(wù)详羡、監(jiān)聽(tīng)的socket、保存的快照以及其他與init相關(guān)的信息嘿悬;這些配置文件主要保存在:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
- unit的常見(jiàn)類型
unit單元 | 文件擴(kuò)展名 | 解釋說(shuō)明 |
---|---|---|
Service unit | .service | 定義系統(tǒng)服務(wù) |
Target unit | .Target | 用于模擬實(shí)現(xiàn)"運(yùn)行級(jí)別" |
Device unit | .device | 定義內(nèi)核識(shí)別的設(shè)備 |
Mount unit | .mount | 定義文件系統(tǒng)掛載點(diǎn) |
Socket unit | .socket | 標(biāo)識(shí)進(jìn)程間通信用到的socket文件 |
Snapshot unit | .snapshot | 管理系統(tǒng)快照 |
Swap unit | .swap | 標(biāo)識(shí)swap設(shè)備 |
Automount unit | .automount | 文件系統(tǒng)自動(dòng)掛載點(diǎn)設(shè)備 |
Path unit | .path | 定義文件系統(tǒng)中的一文件或目錄 |
CentOS 7管理系統(tǒng)服務(wù)service unit:
Control the systemd system and service manager
systemctl [OPTIONS...] COMMAND [NAME...]
動(dòng)作 | CentOS 6 | CentOS 7 |
---|---|---|
啟動(dòng) | service NAME start | systemctl start NAME.service |
停止 | service NAME stop | systemctl stop NAME.service |
重啟 | service NAME restart | systemctl restart NAME.service |
狀態(tài) | service NAME status | systemctl status NAME.service |
條件式重啟 | service NAME condrestart | systemctl try-restart NAME.service |
重載或重啟 | systemctl reload-or-restart NAME.service | |
重載或條件式重啟 | systemctl reload-or-try-restart NAME.service | |
查看某服務(wù)當(dāng)前激活與否的狀態(tài) | systemctl is-active NAME.service | |
查看所有已激活的服務(wù) | systemctl list-units --t service | |
查看所有服務(wù)(包含未激活) | chkconfig --list systemctl list-units -t NAME.service -a | |
設(shè)置服務(wù)開(kāi)機(jī)自啟 | chkconfig NAME on | systemctl enable NAME.service |
禁止服務(wù)開(kāi)機(jī)自啟 | chkconfig NAME off | systemctl disable NAME.service |
查看某服務(wù)是否能開(kāi)機(jī)自啟 | chkconfig --list NAME | systemctl is-enabled NAME.service |
禁止某服務(wù)設(shè)定為開(kāi)機(jī)自啟 | systemctl mask NAME.service | |
取消此禁止 | systemctl umask NAME.service | |
查看服務(wù)依賴關(guān)系 | systemctl list-dependencies NAME.service |
管理target units:
- 運(yùn)行級(jí)別:
運(yùn)行級(jí)別 | 對(duì)應(yīng)別名 | 服務(wù)名 |
---|---|---|
0 | runlevel0.target | poweroff.target |
1 | runlevel1.target | rescue.target |
2 | runlevel2.target | multi-user.target |
3 | runlevel3.target | multi-user.target |
4 | runlevel4.target | multi-user.target |
5 | runlevel5.target | graphical.target |
6 | runlevel6.target | reboot.target |
service unit文件組織格式:
文件通常由三段組成:
[Unit]:主要定義與Unit類型無(wú)關(guān)的通用選項(xiàng)实柠;用于提供當(dāng)前unit的描述信息、unit行為及依賴關(guān)系善涨;
[Service]:與特定類型相關(guān)的專用選項(xiàng)窒盐;此處為service類型;
(UNIT-TYPE钢拧,類似是什么就為相對(duì)應(yīng)的名稱)
[Install]:定義由"systemctl enable"以及"systemctl disable"命令在實(shí)現(xiàn)服務(wù)啟用或禁用時(shí)用到的一些選項(xiàng)蟹漓;
各部分釋義:
- [Unit] 段的常用選項(xiàng):
Description:描述信息; 意義性描述源内;
After:定義unit的啟動(dòng)次序葡粒,表示當(dāng)前unit應(yīng)該晚于哪些unit啟動(dòng);其功能與Before相反膜钓;
Requies:依賴到的其它units嗽交;強(qiáng)依賴,被依賴的units無(wú)法激活時(shí)呻此,當(dāng)前unit即無(wú)法激活轮纫;
Wants:依賴到的其它units;弱依賴焚鲜;
Conflicts:定義units間的沖突關(guān)系 - [Service] 段的常用選項(xiàng):
Type:用于定義影響ExecStart及相關(guān)參數(shù)的功能的unit進(jìn)程啟動(dòng)類型掌唾,其類型有:
simple:默認(rèn)值放前,執(zhí)行ExecStart指定的命令,啟動(dòng)主進(jìn)程
forking:以 fork 方式從父進(jìn)程創(chuàng)建子進(jìn)程糯彬,創(chuàng)建后父進(jìn)程會(huì)立即退出
oneshot:一次性進(jìn)程凭语,Systemd 會(huì)等當(dāng)前服務(wù)退出,再繼續(xù)往下執(zhí)行
dbus:當(dāng)前服務(wù)通過(guò)D-Bus啟動(dòng)
notify:當(dāng)前服務(wù)啟動(dòng)完畢撩扒,會(huì)通知systemd再繼續(xù)往下執(zhí)行
idle:若有其他任務(wù)執(zhí)行完畢似扔,當(dāng)前服務(wù)才會(huì)運(yùn)行
EnvironmentFile:環(huán)境配置文件;
ExecStart:指明啟動(dòng)unit要運(yùn)行命令或腳本搓谆;
ExecStartPre:在ExecStart之前運(yùn)行炒辉;
ExecStartPost:在ExecStart之后運(yùn)行;
ExecStop:指明停止unit要運(yùn)行的命令或腳本泉手;
Restart:當(dāng)設(shè)定Restart=1時(shí)黔寇,則當(dāng)次daemon服務(wù)意外終止后,會(huì)再次自動(dòng)啟動(dòng)斩萌。 - [Install] 段的常用選項(xiàng):
Alias:別名缝裤,可使用systemctl command Alias.service;
RequiredBy:被哪些units所依賴颊郎;
WantedBy:被哪些units所依賴 注意:對(duì)于新創(chuàng)建的unit文件或修改了的unit文件憋飞,要通知systemd重載此配置文件,通過(guò)命令 systemctl daemon-reload
編譯安裝nginx\apache,并通過(guò)systemd來(lái)管理
第一步--安裝nginx基礎(chǔ)依賴包并創(chuàng)建用戶
[root@wujunjie ~]# yum install pcre pcre-devel.x86_64 openssl-devel.x86_64 -y
[root@wujunjie ~]# useradd nginx
[root@wujunjie ~]# echo nginx|passwd --stdin nginx
第二步--下載nginx并編譯安裝
[root@wujunjie ~]#官網(wǎng)下載nginx包
[root@wujunjie tools]# tar -xf nginx-1.14.0.tar.gz
[root@wujunjie tools]# ls
nginx-1.14.0 nginx-1.14.0.tar.gz
[root@wujunjie tools]# cd nginx-1.14.0/
[root@wujunjie nginx-1.14.0]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx1.4/ --with-http_stub_status_module --with-http_ssl_module
[root@wujunjie nginx-1.14.0]# make && make install
第三步--編輯配置文件
[root@wujunjie ~]# cd /usr/lib/systemd/system
[root@wujunjie system]# vim nginx.service
[unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx1.4/sbin/nginx
ExecReload=/usr/local/nginx1.4/sbin/nginx -s reload
ExecStop=/usr/local/nginx1.4/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
第四步--最后重啟姆吭;關(guān)閉nginx
[root@wujunjie ~]# systemctl daemon-reload #重新載入
[root@wujunjie ~]# systemctl start nginx.service
[root@wujunjie ~]# systemctl reload nginx.service
[root@wujunjie ~]# systemctl stop nginx.service
二榛做、描述awk命令用法及示例(至少3例)
簡(jiǎn)介
awk是一個(gè)強(qiáng)大的文本分析工具,相當(dāng)于grep的查找猾编,sed的編輯瘤睹,awk在其對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí),顯得尤為強(qiáng)大答倡。awk就是把文件逐行讀入轰传,以空格為默認(rèn)分隔符將每行切片,切開(kāi)的部分再進(jìn)行各種分析處理瘪撇。基本用法:
gawk [options] 'program' FILE ...
program: PATTERN{ACTION STATEMENTS}
PATTERN:模式有多種获茬,有地址定界作用,不同于sed或grep里面的概念倔既;
ACTION STATEMENTS:動(dòng)作語(yǔ)句恕曲,可有多個(gè)語(yǔ)句,但語(yǔ)句之間用分號(hào)分隔渤涌;可認(rèn)為是腳本里的調(diào)用命令佩谣,這不過(guò)用的是awk內(nèi)建命令;如:print, printf(格式化輸出)選項(xiàng):
-F:指明輸入時(shí)用到的字段分隔符实蓬;
-v VAR=VALUE: 自定義變量茸俭;-
awk的基本處理機(jī)制
一次從文件中讀取一行文本吊履,awk會(huì)對(duì)其自動(dòng)進(jìn)行切片,將每一行按字符串的分隔符進(jìn)行切割调鬓。如這一行是this is a test艇炎,它會(huì)默認(rèn)使用空白字符當(dāng)分隔符,不管空了幾個(gè)格腾窝,這樣這一行就會(huì)成四片缀踪,一片中保存一個(gè)單詞,而這四片在awk中可以使用一個(gè)變量來(lái)引用虹脯,這個(gè)變量相關(guān)于腳本中的位置參數(shù)$1,$2... ,$0表示這一整行驴娃。awk默認(rèn)使用空白當(dāng)分隔符,也可以指定分隔符归形。
1托慨、printprint item1, item2, ...
-
要點(diǎn):
(1) 逗號(hào)分隔符鼻由;
(2) 輸出的各item可以字符串暇榴,也可以是數(shù)值;當(dāng)前記錄的字段蕉世、變量(2,..)或awk的表達(dá)式蔼紧;
(3) 如省略item,相當(dāng)于print $0; 即$0代表一整行內(nèi)容狠轻,默認(rèn)顯示就為$0即整行內(nèi)容奸例;
例:[root@wujunjie ~]# vim 12 this is a,test [root@wujunjie ~]# awk '{print $1,$2}' 12 this is [root@wujunjie ~]# awk -F, '{print $1}' 12 this is a [root@wujunjie ~]# awk '{print $0}' 12 this is a,test
2、變量
2.1內(nèi)建變量
常用內(nèi)置變量之記錄變量
FS:input field seperator向楼,輸入分隔符查吊,默認(rèn)為空白字符;
OFS:output field seperator湖蜕,輸出分隔符逻卖,默認(rèn)為空白字符;
RS:input record seperator昭抒,輸入時(shí)的換行符评也;一行為一條record;默認(rèn)為行分隔符灭返;
ORS:output record seperator盗迟,輸出時(shí)的換行符;一行為一條record熙含;默認(rèn)為行分隔符罚缕;
-
awk內(nèi)置變量之?dāng)?shù)據(jù)變量
NF:number of field,字段數(shù)量怎静,即每行的字段數(shù)量邮弹;
注意:{print NF}, {print $NF}的區(qū)別喂饥;
NR:number of record, 行數(shù);即對(duì)文件中的行進(jìn)行編號(hào)肠鲫;
FNR:各文件分別計(jì)數(shù)员帮;行數(shù);
FILENAME:當(dāng)前文件名导饲;即顯示每行的文件名捞高;
ARGC:命令行中參數(shù)的個(gè)數(shù);
ARGV:數(shù)組渣锦,保存的是命令行中所給定的各參數(shù)硝岗;
例:[root@wujunjie ~]# awk '{print NF}' /etc/issue 1 5 0 顯示issue文件中每一行有多少字段; [root@wujunjie ~]# awk '{print NR}' /etc/issue 1 2 3 統(tǒng)計(jì)行數(shù)袋毙,顯示行號(hào)型檀; [root@wujunjie ~]# awk '{print NR}' 12 /etc/issue 1 2 3 4 顯示內(nèi)容:兩文件的總行數(shù); [root@wujunjie ~]# awk '{print FNR}' 12 /etc/issue 1 1 2 3 顯示內(nèi)容:兩文件分別顯示行數(shù)听盖;
2.2自定義變量
(1) -v VAR=VALUE變量名區(qū)分字符大小寫胀溺;
(2) 在program中直接定義
注意:定義變量,同bash中一樣皆看,用時(shí)定義即可仓坞;
[root@wujunjie ~]# awk -v test='hello gawk' '{print test}' /etc/issue
hello gawk
hello gawk
hello gawk
文件此處沒(méi)什么用,只有一個(gè)顯示行數(shù)作用腰吟;即文件有12行顯示了每行顯示一次无埃,顯示了3行;
3毛雇、printf命令(格式化輸出命令)
printf FORMAT, item1, item2, ...
FORMAT是格式符嫉称,為每個(gè)item按位占一個(gè)位留一個(gè)特殊符號(hào),所以item最終會(huì)顯示在format指定格式符號(hào)的位置上灵疮;
-
要點(diǎn):
(1) FORMAT必須給出;
(2) 在顯示多行文本時(shí)织阅,不會(huì)自動(dòng)換行,需要顯式給出換行控制符始藕,\n蒲稳;
(3) FORMAT中需要分別為后面的每個(gè)item指定一個(gè)格式化符號(hào);
格式符:
%c: 顯示字符的ASCII碼伍派;
%d, %i: 顯示十進(jìn)制整數(shù)江耀;decimal,integer诉植;
%e, %E: 科學(xué)計(jì)數(shù)法數(shù)值顯示祥国;
%f:顯示為浮點(diǎn)數(shù);
%g, %G:以科學(xué)計(jì)數(shù)法或浮點(diǎn)形式顯示數(shù)值;
%s:顯示字符串舌稀;
%u:無(wú)符號(hào)整數(shù)啊犬;
%%: 顯示%自身;
例:[root@wujunjie ~]# head -3 /etc/passwd|awk -F: '{printf "%s\n",$1}' root bin daemon 以字符串顯示每行的第1字段壁查;每字段一行觉至; [root@wujunjie ~]# head -3 /etc/passwd|awk -F: '{printf "username:%s\n",$1}' username:root username:bin username:daemon 顯示指定字符串即username:,同時(shí)以字符串顯示每行的第1字段睡腿;每字段一行语御;
修飾符:
#[.#]:第一個(gè)數(shù)字控制顯示的寬度;第二個(gè)#表示小數(shù)點(diǎn)后的精度席怪;默認(rèn)右對(duì)齊应闯;
%3.1f:3表示顯示3個(gè)字符的寬度;
-: 左對(duì)齊
+:顯示數(shù)值的符號(hào)
4挂捻、操作符
算術(shù)操作符:
x+y, x-y, x*y, x/y, x^y(x的y次方), x%y(取模)
-x:把整數(shù)轉(zhuǎn)為負(fù)數(shù)碉纺;
+x: 把字符串轉(zhuǎn)換為數(shù)值;
字符串操作符:
沒(méi)有符號(hào)的操作符刻撒,字符串連接(一般使用內(nèi)建函數(shù)進(jìn)行字符串切片)
賦值操作符:
=, +=, -=, *=, /=, %=, ^=(增強(qiáng)相賦值)
++, --(自增骨田、自減運(yùn)算)
比較操作符:
>, >=, <, <=, !=, ==(等值比較)
模式匹配符:
~:左側(cè)字符串是否能被右側(cè)模式匹配;
!~:左側(cè)字符串是否不能被右側(cè)模式匹配疫赎;
邏輯操作符:將多個(gè)操作連接起來(lái)盛撑;
&& 與運(yùn)算
|| 或運(yùn)算
! 非運(yùn)算
函數(shù)調(diào)用:(這才是規(guī)范使用方式)
function_name(argu1, argu2, ...)
條件表達(dá)式:
selector?if-true-expression:if-false-expression
5、PATTERN(實(shí)現(xiàn)地址定界功能)
(1) empty:空模式捧搞,匹配每一行;
(2) /regular expression/:僅處理能夠被此處的(正則表達(dá)式)模式匹配到的行狮荔;前面加!表示對(duì)模式過(guò)濾的條件取反胎撇;
(3) relational expression: 關(guān)系(比較)表達(dá)式;結(jié)果有“真”有“假”殖氏;結(jié)果為“真”才會(huì)被處理晚树;
真:結(jié)果為非0值,非空字符串雅采;
假:0爵憎,空字符串;
(4) line ranges:行范圍婚瓜,
/pat1/,/pat2/:startline,endline表示地址定界宝鼓;
注意: 不支持直接給出數(shù)字的格式
~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
(5) BEGIN/END模式
BEGIN{program}: 僅在開(kāi)始處理文件中的文本之前執(zhí)行一次程序;顯示表頭巴刻;
END{program}:僅在文本處理完成之后命令結(jié)束之前執(zhí)行一次程序愚铡;
6、常用的action
(1) Expressions
(2) Control statements:if, while等;
(3) Compound statements:組合語(yǔ)句沥寥;
(4) input statements
(5) output statements
7碍舍、控制語(yǔ)句
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 }
7.1 if-else語(yǔ)句,支持雙分支if語(yǔ)句邑雅,完成條件判斷片橡;
語(yǔ)法格式:if(condition) statement [else statement]
語(yǔ)句如果有多個(gè),需要用{}括起來(lái)淮野;如果有else語(yǔ)句锻全,各語(yǔ)句都要用{};
使用場(chǎng)景:對(duì)awk取得的整行或某個(gè)字段做條件判斷時(shí)使用录煤;
7.2 while循環(huán)
語(yǔ)法格式:while(condition) statement
條件“真”鳄厌,進(jìn)入循環(huán);條件“假”妈踊,退出循環(huán)了嚎;語(yǔ)句如果有多個(gè),需要用{}括起來(lái)廊营;
要根據(jù)初始條件判斷為真或假歪泳,如果為假,則一次都不會(huì)執(zhí)行露筒;
使用場(chǎng)景:對(duì)一行內(nèi)的多個(gè)字段逐一進(jìn)行類似處理時(shí)使用呐伞;或?qū)?shù)組中的各元素逐一處理時(shí)使用短纵;
7.3 do-while循環(huán)
語(yǔ)法:do statement while(condition)
7.4 for循環(huán)
語(yǔ)法格式:for(expr1;expr2;expr3) statement
expr1:控制變量初始化准潭;
expr2:條件判斷外恕;
expr3:控制變量的數(shù)值修正表達(dá)式忘苛;
for(variable assignment;condition;iteration process) {for-body}
即:for(變量賦值荸型;條件判斷表達(dá)式蔑祟;變量修正表達(dá)式) {循環(huán)體語(yǔ)句} 意義:無(wú)論條件真假绍豁,先執(zhí)行一次睹簇,即至少執(zhí)行一次循環(huán)體
7.5 switch語(yǔ)句(在awk中用的不多)
語(yǔ)法格式:
switch(expression) {case VALUE1 or /REGEXP1/: statement1; case VALUE2 or /REGEXP2/: statement2; ...; default: statement}
7.6 break和continue(不做詳細(xì)介紹掌眠,用到時(shí)再說(shuō))
break [n]:退出n層循環(huán)蕾盯;
continue:提前結(jié)束本輪循環(huán),直接進(jìn)入下一輪循環(huán)(即下一個(gè)字段)蓝丙;
7.7 next
在awk中能實(shí)現(xiàn)2重循環(huán)级遭,awk本身可對(duì)文件每行循環(huán),使用循環(huán)語(yǔ)句是為了遍歷一行中的每個(gè)字段渺尘,或數(shù)組中的每個(gè)元素挫鸽;
next同continue一樣,也是控制循環(huán)的沧烈,但是是控制awk的本身循環(huán)的掠兄;即提前結(jié)束對(duì)本行的處理而直接進(jìn)入下一行;
8、array數(shù)組
關(guān)聯(lián)數(shù)組:array[index-expression]
index-expression:索引表達(dá)式
(1) 可使用任意字符串蚂夕;字符串要使用雙引號(hào)迅诬;不能隨便使用單引號(hào);
(2) 如果某數(shù)組元素事先不存在婿牍,在引用時(shí)侈贷,awk會(huì)自動(dòng)創(chuàng)建此元素,并將其值初始化為“空”等脂;允許未經(jīng)聲明直接引用俏蛮;
若要判斷數(shù)組中是否存在某元素,要使用"index in array"格式進(jìn)行上遥;
三搏屑、描述awk函數(shù)示例(至少3例)
-
3.1內(nèi)置函數(shù)
數(shù)值處理:
rand():返回0和1之間一個(gè)隨機(jī)數(shù);在大多數(shù)awk實(shí)現(xiàn)中粉楚,包括gawk辣恋,每次運(yùn)行awk時(shí),rand()都會(huì)從相同的起始數(shù)字或種子開(kāi)始生成數(shù)字模软。因此伟骨,程序每次運(yùn)行時(shí)都會(huì)產(chǎn)生相同的結(jié)果。在一個(gè)AWK運(yùn)行中燃异,這些數(shù)字是隨機(jī)的携狭,但從運(yùn)行到運(yùn)行是可以預(yù)測(cè)的。這便于調(diào)試回俐,但如果希望程序每次使用時(shí)都執(zhí)行不同的操作逛腿,則必須將種子更改為每次運(yùn)行中不同的值。要做到這一點(diǎn)鲫剿,使用srand()
例如: [root@wujunjie ~]# awk 'BEGIN{print rand()}' 0.237788 [root@wujunjie ~]# awk 'BEGIN{print rand()}' 0.237788 [root@wujunjie ~]# awk 'BEGIN{srand();print rand()}' 0.343 [root@wujunjie ~]# awk 'BEGIN{srand();print rand()}' 0.0389058
字符串處理:
length([s]):返回指定字符串的長(zhǎng)度鳄逾;
sub(r,s,[t]):以r表示的模式來(lái)查找t所表示的字符中的匹配的內(nèi)容,并將其第一次出現(xiàn)替換為s所表示的內(nèi)容灵莲;
例如:
[root@wujunjie ~]# awk -F: '{sub(o,O,$1)}' /etc/passwd
把每行的第1字段中,第一次出現(xiàn)的小寫o替換為大寫O殴俱;注意:僅替換每行一次出現(xiàn)的政冻;
gsub(r,s,[t]):以r表示的模式來(lái)查找t所表示的字符中的匹配的內(nèi)容,并將其所有出現(xiàn)的內(nèi)容均替換為s所表示的內(nèi)容线欲;
split(s,a[,r]):以r為分隔符切割字符s明场,并將切割后的結(jié)果保存至a所表示的數(shù)組中;數(shù)組元素從1開(kāi)始編號(hào)李丰;
例如:
[root@wujunjie ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
192.168.32.1 1
0.0.0.0 6
顯示來(lái)訪的主機(jī)地址連接的次數(shù)苦锨;
- 3.2自定義函數(shù)
可參考《sed和awk》