awk
-F 指明輸入時用到的字段分隔符
默認空格為分隔符
-v 自定義變量
基本格式:awk [options] 'program' file
$1,$2..$n稱為域標識,$0為所有域。
文件的每一行稱為記錄
awk '{print}' /etc/passwd
默認 print $0 顯示全段
awk 'BEGIN{print "hello,awd"}'
awk '{print "hello,awd"}' 支持輸入
df |awk '{print $5}'
df |awk '{print $1,$5}' ,默認以空格隔開
df |awk '{print $1"\t"$5}'
awk -F: 'print $1,$3' /etc/passwd
-F: 用:號作為分隔符
awk變量
輸入字段分隔符
awk -v FS=":" '{print $1}' /etc/passwd
-v FS=":" 等于-F:
awk -v FS="bash" '{print $1}' /etc/passwd
awk -v FS=":" -v OFS="+++"' '{print $1,$3,$4,$5}' /etc/passwd 定義輸出時候的分隔符
冒號分隔之后用+++替代分隔
awk -v FS=":" -v OFS="\t" '{print $1,$3,$4,$5}' /etc/passwd
awk -v RS=" " '{print $1,$2}' f1 輸出將空格成為獨立的行 記錄的分隔符
awk -v RS=" " -v OFS="—" -v ORS="***" '{print $1,$2}' f1 -v ORS="***" 這個替換的是回車換行
NF 統計字段
awk -F: '{print NF}' /etc/passwd
NF統計字段
awk -v FS=":" '{print $NF}' /etc/passwd 等于顯示$7
awk -v FS=":" '{print $(NF-1)}' /etc/passwd 等于顯示$6
NR 顯示行號
awk -v FS=":" '{print NR,$0}' /etc/passwd
awk -v FS=":" '{print NR,$0}' /etc/passwd /etc/issue
FNR 分開文件計算
awk -v FS=":" '{print FNR,$0}' /etc/passwd /etc/issue
FILENAME 每一行打印出文件名
awk -v FS=":" '{print FILENAME,$0}' /etc/passwd /etc/issue
將文件名字和路徑寫在前面
ARGC 顯示命令的參數
awk -v FS=":" '{print ARGC,$0}' /etc/passwd /etc/issue
ARGV 查看那幾個參數
awk -v FS=":" '{print ARGV[0]}' /etc/passwd /etc/issue 查看第一個參數 [0-2] 3個
變量:內置和自定義變量
?FS:輸入字段分隔符,默認為空白字符
awk-v FS=':' '{print $1,$3,$7}’ /etc/passwd
awk–F: '{print $1,$3,$7}’ /etc/passwd
OFS:輸出字段分隔符,默認為空白字符
awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效
awk -v RS=' ' ‘{print }’ /etc/passwd
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
NF:字段數量
awk -F:‘{print NF}’ /etc/fstab,引用內置變量不用$
awk -F: '{print $(NF-1)}' /etc/passwd
顯示的是倒數第二位等于顯示$6
NR:行號
awk '{print NR}' /etc/fstab; awk END'{print NR}' /etc/fstab
1-12是etc/fstab的行數,54是/etc/passwd的行數
awk自定義變量
awk -F: -v name="supername" '{print name,$1}' /etc/passwd
里面定義的name="supername"
awk -F: -v name="supername" -f bin/awk.sh /etc/passwd -f可以調用
awk -F: '{name="superman";print name,$1}' /etc/passwd 定義多個變量
printf 命令
格式符:與item一一對應
%c: 顯示字符的ASCII碼
%d, %i: 顯示十進制整數
%e, %E:顯示科學計數法數值
%f:顯示為浮點數
%g, %G:以科學計數法或浮點形式顯示數值
%s:顯示字符串
%u:無符號整數
%%: 顯示%自身
awk -F: '{printf "%s %d\n ",$1,$3}' /etc/passwd
awk -F: '{printf "%20s %10.2fd\n ",$1,$3}' /etc/passwd %20字符寬度,默認右對齊,左對齊%-20
%10.2f 寬度為10,顯示后兩位小數
操作符號,+ – * / 都支持
awk 'BEGIN{print 10*10}'
awk -v i=1 'BEGIN{print i++,i}'
顯示1 2 i在前就顯示i,++i就加完再打印
$0~"$root" 默認包含root
awk -F: '$3==0' /etc/passwd
'$3=="root"' 數字可以不加""
三目表達式
awk -F: '{$3>=1000?username="commonuser":username="sysuser";printf "%s %s %d",username,$1,$3}' /etc/passwd
模式過濾
沒寫模式默認全部處理
正則表達式
awk '/^UUID/' /etc/fstab
將UUID開頭的句子顯示出來
awk '/bash$/' /etc/passwd
將bash結尾的行顯示出來
relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;
真:結果為非0值,非空字符串
假:結果為空字符串
awk -F: '/^root\>/,/^ftp\>/' /etc/passwd
/root/開頭到 /ftp/開頭
awk -F:'BEGIN{print "username uid"}/^root\>/,/^ftp/{print $1,$3}END{print "end file"}' /etc/passwd
print與printf的區別在前者負責的數據會自動換行
判定語句
seq 10|awk 'i=!i'
第一行i開始=0 !i=1 第二行i=1 !i=0 第三行重復第一行,所以只會顯示單數行。
所以顯示奇數值
seq 10|awk '!(i=!i)'
加非判斷結果顯示偶數行
seq 10|awk -v i=1 'i=!i'
偶數值
一開始賦值就是1,非1等于0假不輸出。
seq 10|awk '{i=!i;print i}' 可以查看到i的值變化
組合語句
if-else
if(條件){組合}else if(條件){組合}else(條件){組合}
awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
將ID大于1000的用戶名字和ID打印出來,-F:用:號來做分隔符。
多條件判定
awk 'BEGIN{ test=100;if(test>90){ print "very good";}else if(test>60){ print "good";}else{ print "no pass";}}'
根據數據判定
while循環
條件真進入循環,條件假退出循環
awk
do-while循環
?語法:do statement while(condition)
?意義:無論真假,至少執行一次循環體
awk在處理數值較大的時候速度比較有優勢
break和continue
break 直接退出循環
continue 直接跳過當次循環
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0){continue}sum+=i}print sum}'
執行循環,當偶數的時候就跳出,等于奇數雙加
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==11){break}sum+=i}print sum}'
等于執行了10次的雙加,第11次完全跳出循環
next
?提前結束對本行處理而直接進入下一行處理(awk自身循環)
awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd
打印UUID為偶數的行
awk數組
關聯數組:array[index-expression]
?index-expression:
(1) 可使用任意字符串;字符串要使用雙引號括起來
(2) 如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”
若要判斷數組中是否存在某元素,要使用“index in array”格式進行遍歷
awk 'BEGIN{week[0]="sun";week[1]="mon"; print week[0]}'
數組[0]的數值
awk 'BEGIN{week["frist"]="sum";week["two"]="mon";print week["frist"]}'
字符串要用“”引入,純數字可以不加。
awk '!arr[0]++' f1 去重復
awk '{!arr[$0]++;print $0,arr[$0]}' f1
第一次![$0]=1 再++所以第一次是真 輸出
第二次出現重復的時候[$0]=2取反就是假。所以不輸出
第二次出現的數值+1之后判定條件就為正數,!正數等于0,就不輸出重復的行數了。
遍歷數組
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]
="Tuesday";for(i in weekdays) {print weekdays[i]}}‘
顯示所有的組成員
netstat -tan | awk'/^tcp\>/{state[$NF]++}END
{for(i in state) { print i,state[i]}}'
最后的參數遇到相同的后面+1
awk '{state[$1]++}END{for(i in state){ print i,state[i]}}'
awk函數
awk 'BEGIN{srand();print rand()}'
生成隨機數
awk 'BEGIN{srand();print int(rand()*100)}'
生成整數隨機數
awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'
顯示10個隨機整數
sub/gsub (替換單個/替換整行)
echo "2008:08:08 08:08:08" | awk'sub(/:/,"",$1)'
第一個冒號分隔符替換
echo "2008:08:08 08:08:08" | awk‘gsub(/:/,"",$1)' gsub整個替換
因為我輸出的是$1,awk格式是默認空格為分隔號,所以替換$1的整行冒號。(這里$1=2008:08:08)
split($5,ip,":") ip這個組從[1]開始
netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}' 得出IP地址和IP地址出現的次數
統計IP鏈接的次數
function函數調用
awk -f fun.awk 調用awk函數
使用就fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
END{a=3;b=2;print max(a,b);}
要加執行權限使用
腳本調用開頭寫
!/bin/awk -f 加上執行權限就能直接運行
awk中使用操作系統的指令
awk 'BEGIN{system("hostname")}'
awk 'BEGIN{system("echo xxx")}'
awk 'BEGIN{name="zczx";system("echo " name)}'
awk腳本
#cat f1.awk
{if($3>=1000)print $1,$3}
#awk -F: -f f1.awk /etc/passwd
#cat f2.awk
#!/bin/awk –f
#this is a awk script
{if($3>=1000)print $1,$3}
#chmod +x f2.awk
#f1.awk –F: /etc/passwd
傳遞參數
#cat f2.awk
#!/bin/awk –f
{if($3 >=min && $3<=max)print $1,$3}
#f2.awk -F: min=100 max=200 /etc/passwd
指定 -F: 為分隔符號
1、統計/etc/fstab文件中每個文件系統類型出現的次數# awk'/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
2、統計/etc/fstab文件中每個單詞出現的次數;
# awk'{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
systemd 7版本之后使用的管理系統的工具
紅帽開發的守護進程
CentOS 5: SysVinit
CentOS 6: Upstart
CentOS 7: Systemd
Systemd:系統啟動和服務器守護進程管理器,負責在系統啟動或運行時,激活系統資源,服務器進程和其它進程
最大特點:系統引導實現服務并行啟動
在6版本以前版本都是串行啟動,所以啟動較慢
unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息
?配置文件:
/usr/lib/systemd/system:每個服務最主要的啟動腳本設置,類似于之前的/etc/init.d/
/run/systemd/system:系統執行過程中所產生的服務腳本,比上面目錄優先運行
/etc/systemd/system:管理員建立的執行腳本,類似于/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先運行
cd /etc/systemd/system 如果要存放服務的時候,放在這個路徑下比較安全
systemclt
systemclt -t 可以查看unit類型
automount 文件系統自動掛載
系統服務的管理
systemctl 支持保全
命令:systemctlCOMMAND name.service
啟動:service name start ==> systemctlstart name.service
停止:service name stop ==> systemctlstop name.service
重啟:service name restart ==> systemctlrestart name.service
狀態:service name status ==> systemctlstatus name.service
禁止自動和手動啟動:
systemctl mask name.service
取消禁止:
systemctl unmask name.service
用于不常用的服務可以通過禁止啟動。
可以通過手動更改服務路徑可以跳過mask 啟動,mask 的原理就是將啟動的軟連接改成指向/dev/null。
systemctl list-units -t service 查看所有活動的服務
systemctl list-units -t service -all 查看所有的服務
systemctl is-enabled httpd 查詢是否開機啟動
systemctl enabled httpd 改成開機啟動
systemctl disabled httpd 改成開機不啟動
systemctl list-dependencies httpd.service 查看服務的依賴性
systemctl kill 進程 殺進程
顯示所有單元狀態
systemctl
只顯示服務單元的狀態
systemctl –type=service
顯示sshd服務單元
systemctlstatus sshd.service–l
驗證sshd服務當前是否活動
systemctl is-active sshd
啟動,停止和重啟sshd服務
systemctl start sshd.service
systemctl stop sshd.service
systemctl restart sshd.service
重新加載配置
systemctl reload sshd.service
列出活動狀態的所有服務單元
systemctl list-units –type=service
列出所有服務單元
systemctl list-units –type=service –all
查看服務單元的啟用和禁用狀態。
systemctl list-unit-files –type=service
列出失敗的服務
systemctl –failed –type=service
target
systemctl list-dependencies .target 查看target的依賴性
systemctl get-default 查看現在是神馬狀態
systemctl get-default multi-usr.target 切換默認開機成字符界面
graphical.target 圖形界面
通過更改軟鏈接路徑修改
systemctl isolate multi-usr.target 切換成字符界面
systemctl isolate graphical.target 切換成圖形界面
軟連接指向誰就運行誰
systemctl rescue 切換成救援模式
systemctlemergency 切換至emergency模式
CentOS7引導順序
UEFi或BIOS初始化,運行POST開機自檢
選擇啟動設備
引導裝載程序, centos7是grub2
加載裝載程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
加載initramfs驅動模塊
加載內核選項
內核初始化,centos7使用systemd代替init
執行initrd.target所有單元,包括掛載/etc/fstab
從initramfs根文件系統切換到磁盤根目錄
systemd執行默認target配置,配置文件/etc/systemd/default.target/etc/systemd/system/
服務格式
cat httpd.service
分3部分
[unit]
Description描述
After:unit的啟動次序 想當與依賴關系
Before:與after 相反
Requires: 強依賴,依賴的units無法激活,當前unit也無法激活
Wants:弱依賴
Conflicts:沖突項目
[Service]
Type
EnvironmentFile 文件路徑
ExecStart 絕對路徑
ExecReload 絕對路徑
[Install]
Alias:別名
RequiredBy:強依賴
WantsdBy:強依賴
/etc/systemd/system :系統管理員和用戶使用
/usr/lib/systemd/system 開發者使用
破解7root口令
啟動時任意鍵暫停啟動
按e鍵進入編輯模式
將光標移動linux16開始的行,添加內核參數rd.break
按ctrl-x啟動 類似單一用戶
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel 自動打標簽,因為修改了標簽會可能破壞了
原創文章,作者:swzczx,如若轉載,請注明出處:http://www.www58058.com/48050