systemd與awk的用法

awk,systemd

1、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理
2、描述awk命令用法及示例(至少3例)
3、描述awk函數示例(至少3例)
1、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理
Systemd
簡介
系統初始化與服務管理工具,是Centos7與Centos5,Centos6不同的init工具。
特性
  • 系統引導時實現服務并行啟動;
  • 按需激活進程;
  • 系統狀態快照;
  • 基于依賴關系定義服務控制邏輯;
  • 基于socket的激活機制:socket與程序分離;
  • 基于bus的激活機制;
  • 基于device的激活機制;
  • 基于Path的激活機制;
  • 系統快照:保存各unit的當前狀態信息于持久存儲設備中;
  • 向后兼容sysv init腳本; /etc/init.d/
核心概念unit
unit由其相關配置文件進行標識、識別和配置;文件中主要包含了系統服務、監聽的socket、保存的快照以及其它與init相關的信息; 這些配置文件主要保存在:
  • /usr/lib/systemd/system
  • /run/systemd/system
  • /etc/systemd/system
unit常見的類型
  • Service unit:文件擴展名為.service,用于定義系統服務;
  • Target unit:文件擴展為.target,用于模擬實現“運行級別”;
  • Device unit: .device,用于定義內核識別的設備;
  • Mount unit: .mount,定義文件系統掛載點;
  • Socket unit: .socket,用于標識進程間通信用到的socket文件;
  • Snapshot unit: .snapshot, 管理系統快照;
  • Swap unit: .swap, 用于標識swap設備;
  • Automount unit: .automount,文件系統自動點設備;
  • Path unit: .path, 用于定義文件系統中的一文件或目錄
管理系統服務
systemctl命令
  • 簡介 控制系統和管理服務工具
  • 格式
    • systemctl [OPTIONS…] COMMAND [NAME…]
  • 常見用法
    • 啟動:systemctl start NAME.service
    • 停止:systemctl stop NAME.service
    • 重啟:systemctl restart NAME.service
    • 狀態:systemctl status NAME.service
    • 條件式重啟:systemctl try-restart NAME.service
    • 重載或重啟服務: systemctl reload-or-restart NAME.servcie
    • 重載或條件式重啟服務:systemctl reload-or-try-restart NAME.service
    • 查看某服務當前激活與否的狀態: systemctl is-active NAME.service
    • 查看所有已激活的服務:systemctl list-units –type service
    • 查看所有服務(已激活及未激活): chkconfig –lsit ==> systemctl list-units -t service –all
    • 設置服務開機自啟:systemctl enable NAME.service
    • 禁止服務開機自啟:systemctl disable NAME.service
    • 查看某服務是否能開機自啟:systemctl is-enabled NAME.service
    • 禁止某服務設定為開機自啟: systemctl mask NAME.service
    • 取消此禁止: systemctl unmask NAME.servcie
    • 查看服務的依賴關系:systemctl list-dependencies NAME.service
管理target
  • 運行級別:CentOS7并沒有很明顯的級別概念,更多的只是為了兼容CentOS5,CentOS6。
    • 0 ==> runlevel0.target, poweroff.target 兩種寫法都是等價的,下同
    • 1 ==> runlevel1.target, rescue.target
    • 2 ==> runlevel2.tartet, multi-user.target
    • 3 ==> runlevel3.tartet, multi-user.target
    • 4 ==> runlevel4.tartet, multi-user.target
    • 5 ==> runlevel5.target, graphical.target
    • 6 ==> runlevel6.target, reboot.target
  • 級別切換
    • systemctl isolate NAME.target
  • 級別查看
    • systemctl list-units –type target
  • 查看所有級別
    • systemctl list-units -t target -a
  • 獲取默認運行級別:
    • systemctl get-default
  • 修改默認運行級別
    • systemctl set-default NAME.target
  • 切換至緊急救援模式
    • systemctl rescue
  • 切換至emergency模式
    • systemctl emergency
    • systemctl emergency
其他常用命令
  • 關機: systemctl halt, systemctl poweroff
  • 重啟: systemctl reboot
  • 掛起: systemctl suspend
  • 快照: systemctl hibernate
  • 快照并掛起: systemctl hybrid-sleep
unit file
  • 文件通常有三部分組成:
    • [Unit]:定義與Unit類型無關的通用選項;用于提供unit的描述信息、unit行為及依賴關系等;以下是一些常見選項
      • Description:描述信息;服務的文檔,可以是一個或多個文檔的URL路徑。;
      • After:定義unit的啟動次序;表示當前unit應該晚于哪些unit啟動;其功能與Before相反;
      • Requies:依賴到的其它units;強依賴,被依賴的units無法激活時,當前unit即無法激活;
      • Wants:依賴到的其它units;弱依賴,其他units啟動失敗并不影響當前unit啟動;
      • Conflicts:定義units間的沖突關系,與這個模塊有沖突的模塊,如果列出模塊中有已經在運行的,這個服務就不能啟動,反之亦然;
  • [Service]:與特定類型相關的專用選項;此處為Service類型;以下是一些常用選項
    • Type:服務的類型,常用的有 simple(默認類型) 和 forking。默認的 simple 類型可以適應于絕大多數的場景,因此一般可以忽略這個參數的配置。而如果服務程序啟動后會通過 fork 系統調用創建子進程,然后關閉應用程序本身進程的情況,則應該將 Type 的值設置為 forking,否則 systemd 將不會跟蹤子進程的行為,而認為服務已經退出。; 類型有以下幾種
      • simple:默認,表示execstart啟動的進程就是主進程
      • forking:表示execstart啟動父進程的一個子進程為主進程,啟動完成之后父進程會退出
      • oneshot:執行一次之后就退出
      • dbus:
      • notify:
      • idle:
    • EnvironmentFile:環境配置文件;
    • ExecStart:指明啟動unit要運行命令或腳本; ExecStartPre, ExecStartPost
    • ExecStop:指明停止unit要運行的命令或腳本;
    • Restart:指名重啟unit需要運行的命令或腳本
    • [Install]:定義由“systemctl enable”以及”systemctl disable“命令在實現服務啟用或禁用時用到的一些選項;
      • Also:當這個服務被enable/disable時,將自動enable/disable后面列出的每個模塊。
      • RequiredBy:和前面的 Requires 作用相似,同樣后面列出的不是服務所依賴的模塊,而是依賴當前服務的模塊;
      • WantedBy:和前面的 Wants 作用相似,只是后面列出的不是服務所依賴的模塊,而是依賴當前服務的模塊。
注意:對于新創建的unit文件或修改了的unit文件,要通知systemd重載此配置文件;
systemctl daemon-reload
例子
為當前系統的nginx服務提供一個unit文件
[Unit]
Description=The nginx HTTP
Server After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
2、描述awk命令用法及示例(至少3例)
awk
簡介
awk的作者是Aho, Weinberger, Kernighan,所以awk名字的由來就是三個作者的首字母組成。報告生成器,格式化文本輸出;
語法
gawk [options] ‘program’ FILE …
program: PATTERN{ACTION STATEMENTS}
常用選項
  • -F:指明輸入時用到的字段分隔符;
  • -v var=value: 自定義變量;
  • -f program-file :可以用-f指定編寫了awk程序的文件
常用的關鍵字
1.print
print item1, item2, …
要點:
  • 逗號分隔符;
  • 輸出的各item可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式;
  • 如省略item,相當于print $0;
例子:
查看系統上的所有用戶
awk -F: ‘{print $1}’ /etc/passwd
2.變量
內建命令:
  • FS:input field seperator,輸入字段分隔符,默認為空白字符;
  • OFS:output field seperator,輸出字段分隔符,默認為空白字符;
  • RS:input record seperator,輸入記錄分隔符,輸入時的換行符;
  • ORS:output record seperator,輸出記錄分隔符,輸出時的換行符;
  • NF:number of field,字段數量 {print NF}, {print $NF}
  • NR:number of record, 行數;
  • FNR:各文件分別計數;行數;
  • FILENAME:當前文件名;
  • ARGC:命令行參數的個數;
  • ARGV:數組,保存的是命令行所給定的各參數;
自定義變量
  • -v var=value
  • 在program中直接定義
例子:
獲取命令行的第二個參數
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab
將:作為字段分隔符,取出最后一個字段的值
awk -v FS=’:’ ‘{print $NF}’ /etc/passwd
awk ‘BEGIN{FS=”:”}{print $NF}’ /etc/passwd
3.printf
格式化輸出
printf FORMAT, item1, item2, …
要點:
  • FORMAT必須給出;
  • 不會自動換行,需要顯式給出換行控制符,\n
  • FORMAT中需要分別為后面的每個item指定一個格式化符號;
常用的格式符
  • %c: 顯示字符的ASCII碼;
  • %d, %i: 顯示十進制整數;
  • %e, %E: 科學計數法數值顯示;
  • %f:顯示為浮點數;
  • %g, %G:以科學計數法或浮點形式顯示數值;
  • %s:顯示字符串;
  • %u:無符號整數;
  • %%: 顯示%自身;
修飾符:
  • #[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后的精度; %3.1f
  • -: 左對齊
  • +:顯示數值的符號
例子
格式化輸出系統用戶以及其UID
awk -F: ‘{printf “username:%15s,UID:%16d\n”,$1,$3}’ /etc/passwd
4.操作數
  • 操作符:
    • x+y
    • x-y
    • x*y
    • x/y
    • x^y
    • x%y
    • -x
    • +x: 轉換為數值;
  • 賦值操作符:
    • =:直接賦值
    • +=:例如x+=5,等價于x=x+5
    • -=:例如x-=5,等價于x=x-5
    • *=:例如x*=5,等價于x=x*5
    • /=:例如x/=5,等價于x=x/5
    • %=:例如x%=5,等價于x=x%5,對5取余
    • :自增;例如i;等價于i=i+1
    • –:自減;例如i–;等價于i=i-1
  • 比較操作符:
    • >:大于比較
    • >=:大于等于
    • <:小于比較
    • <=:小于等于
    • !=:不等于
    • ==:等于
  • 模式匹配符:
    • ~:是否匹配
    • !~:是否不匹配
  • 邏輯操作符:
    • && 與
    • || 或
    • ! 非
  • 函數調用:
    • function_name(argu1, argu2, …)
  • 條件表達式:
    • selector?if-true-expression:if-false-expression
例子
awk -F: ‘{$3>=1000?usertype=”Common User”:usertype=”Sysadmin or SysUser”;printf “%15s:%-s\n”,$1,usertype}’ /etc/passwd
5.PATTERN
  • empty:空模式,匹配每一行;
  • /regular expression/:僅處理能夠被此處的模式匹配到的行;
  • relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;
真:結果為非0值,非空字符串;
  • line ranges:行范圍,
  • startline,endline:/pat1/,/pat2/
注意: 不支持直接給出數字的格式
  • BEGIN/END模式
    • BEGIN{}: 僅在開始處理文件中的文本之前執行一次;
    • END{}:僅在文本處理完成之后執行一次;
例子
1./etc/passwd 所有行的第一個字段
awk -F: ‘{print $1}’ /etc/passwd
2./etc/passwd 第二行到第十行,以:為分隔符的第一個字段
awk -F: ‘(NR>=2&&NR<=10){print $1}’ /etc/passwd
3./etc/passwd 匹配到開頭為root的行
awk -F: ‘/^root\>/{print}’ /etc/passwd
4./etc/passwd 輸出開頭為root與bin之間的行
awk -F: ‘/^root\>/,/^bin\>/{print}’ /etc/passwd
5./etc/passwd 處理文件之前輸出“BEGIN”,處理完輸出“END”
awk ‘BEGIN{printf “BEGIN\n”}{print}END{printf “END\n”}’ /etc/passwd
6.常用的action
  • if-else
語法:if(condition) statement [else statement]
使用場景:對awk取得的整行或某個字段做條件判斷;
例子
/etc/passwd uid大于1000輸出“Common user”,否則輸出“root or Sysuser”
awk -F: ‘{if($3>=1000) {printf “Common user: %s\n”,$1} else {printf “root or Sysuser: %s\n”,$1}}’ /etc/passwd
輸出shell為/bin/bash的用戶
awk -F: ‘{if($NF==”/bin/bash”) print $1}’ /etc/passwd
如果字段數大于5輸出此行
awk ‘{if(NF>5) print $0}’ /etc/fstab
輸出使用量大于10%的磁盤
df -h | awk -F[%] ‘/^\/dev/{print $1}’ | awk ‘{if($NF>=10) print $1}’
  • while循環
語法:while(condition) statement
條件“真”,進入循環;條件“假”,退出循環;
使用場景:對一行內的多個字段逐一類似處理時使用;對數組中的各元素逐一處理時使用;
例子
輸出/etc/grub2.cfg文件中匹配到linux16的行的每個單詞長度
awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}’ /etc/grub2.cfg
輸出/etc/grub2.cfg文件中匹配到linux16的行的長度大于等于7的單詞
awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}’ /etc/grub2.cfg
  • do-while循環
語法:do statement while(condition)
意義:至少執行一次循環體
  • for循環
語法:
    • for(expr1;expr2;expr3) statement
    • for(variable assignment;condition;iteration process) {for-body}
    • for(var in array) {for-body} 遍歷數組
例子
輸出/etc/grub2.cfg文件中匹配到linux16的行的每個單詞長度
awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg
for遍歷數組的特殊用法
awk ‘BEGIN{weekdays[“mon”]=”Monday”;weekdays[“tue”]=”Tuesday”;for(i in weekdays) {print weekdays[i]}}’
  • switch語句
語法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}
  • break和continue
    • break[n] 表示退出n層循環,默認退出本層本層循環
    • continue[n]表示退出本層循環
  • next
提前結束對本行的處理直接進入下一行
輸出UID為偶數的用戶名與UID
awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd
7.array 數組
語法:array[index-expression]
index-expression:
  • 可使用任意字符串;字符串要使用雙引號;
  • 如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”;
例子:
awk ‘BEGIN{for(i=0;i<10;i++){ary[i]=i}for(j=0;j<10;j++){printf “%d\n”,ary[j]}}’
查看各個tcp連接狀態數量
netstat -tan | 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
統計/etc/fstab文件中每個文件系統類型出現的次數;
awk ‘/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}’ /etc/fstab
8.函數
  • 內置函數
    • 常用的數值處理函數
      • 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所表示的數組中;
  • 自定義函數
3、描述awk函數示例(至少3例)
(1)輸出10個隨機數
awk ‘BEGIN{for (i=0;i<10;i++){print rand()}}’
(2)length使用示例
echo “Hello World” | awk ‘{print $0,length($0)}’
(3)split使用示例
netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);count[ip[1]]++}END{for (i in count) {print i,count[i]}}’

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/104631

(0)
halhal
上一篇 2018-08-06 21:45
下一篇 2018-08-07

相關推薦

欧美性久久久久