系統啓動與內核管理 ;AWK部分 重要內容 (實驗及awk的常見面試題)

CentOS6啓動流程
1.加載BIOS的硬件信息,獲取第一個啓動設備
2.讀取第一個啓動設備MBR的引導加載程序(grub)的啓動信息
3.加載核心操做系統的核心信息,核心開始解壓縮,並嘗試驅動全部的硬件設備
4.核心執行init程序,並獲取默認的運行信息
5.init程序執行/etc/rc.d/rc.sysinit文件
6.啓動核心的外掛模塊
7.init執行運行的各個批處理文件(scripts)
8.init執行/etc/rc.d/rc.local
9.執行/bin/login程序,等待用戶登陸
10.登陸以後開始以Shell控制主機
製做centos6系統的ramdisk文件
目的 掌握centos6系統中的啓動順序中/boot目錄的做用,製做啓動時所需的文件ramdisk文件。
前提 可用的centos6系統。
/boot目錄做用
在系統啓動之後,/boot整目錄內容就沒什麼用了,甚至能夠把boot目錄刪除,只要不重啓,系統仍然能正常運行。
利用mkinitrd命令建立ramdisk文件 爲當前正在使用的內核從新制做ramdisk文件,使用mkinitrd命令。
【例1】製做ramdisk文件
爲了證實製做一個ramdisk文件並且啓動正常,則先刪除ramdisk文件。
[root@magedu ~]# ls /boot/initramfs-2.6.32-696.el6.x86_64.img
/boot/initramfs-2.6.32-696.el6.x86_64.img
[root@magedu boot]# rm -f initramfs-2.6.32-696.el6.x86_64.img
注意,該文件名不能隨意定義,由於在啓動文件中是已經定義好的了:
[root@magedu boot]# tail -5 /boot/grub/grub.conf
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/mapper/vg_magedu-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_magedu/lv_swap rd_NO_MD rd_LVM_LV=vg_magedu/lv_root SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img
最後一行,initrd指明瞭該文件的完整名稱,這就是之因此爲何不能隨意指定文件名的緣由。
製做ramdisk文件:
[root@magedu boot]# mkinitrd /boot/initramfs-2.6.32-696.el6.x86_64.img $(uname -r)
時間可能會稍長一些,以後,就可在/boot目錄中新建立了initramfs-2.6.32-696.el6.x86_64.img文件。能夠查看該文件:
[root@magedu boot]# cp initramfs-2.6.32-696.el6.x86_64.img /tmp/
解壓該文件:
[root@magedu tmp]# zcat initramfs-2.6.32-696.el6.x86_64.img |cpio -id
152872 blocks
可使用ls命令查看其結果。如今系統上的ramdisk文件已經被刪除,並且手動建立了一個ramdisk文件,此時重啓系統使用reboot命令,仍然能夠正常啓動。
配置centos6系統各服務的啓動運行級別
目的 掌握centos6系統中配置開機啓動時服務的運行級別。
前提 可用的centos6系統。
實驗步驟
一、runlevel命令:查看上一次及當前系統啓動的運行級別
[root@magedu ~]# runlevel
N 5
N表示上一次切換級別是無切換過。
5表示當前運行級別是有圖形化的完整的多用戶模式。
二、chkconfig命令:查看當前系統啓動時服務的運行級別
[root@magedu ~]# chkconfig --list
NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off
abrt-ccpp     0:off 1:off 2:off 3:on 4:off 5:on 6:off
abrtd         0:off 1:off 2:off 3:on 4:off 5:on 6:off
acpid         0:off 1:off 2:on 3:on 4:on 5:on 6:off
atd           0:off 1:off 2:off 3:on 4:on 5:on 6:off
...
以crond服務爲例,查看開機啓動時在各運行級別中是否開機啓動:
[root@magedu ~]# chkconfig --list|grep crond
crond         0:off 1:off 2:on 3:on 4:on 5:on 6:off
從結果看crond服務分別在0-6的運行級別中開機分別爲: 在0級別關機模式中是關閉的; 在1級別單用戶模式中開機自動關閉; 在2級別沒有網絡的多用戶模式中開機自動啓動; 在3級別完整的多用戶模式中的開機自動啓動; 在4級別自定義模式中開機自動啓動; 在5級別有圖形化的完整的多用戶模式中開機自動啓動; 在6級別重啓模式中開機自動關閉。
[root@magedu ~]# ll /etc/rc.d/rc?.d/???crond
lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc0.d/K60crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc1.d/K60crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc2.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc3.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc4.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc5.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc6.d/K60crond -> ../init.d/crond
此結果說明rc0.d-rc6.d分別是設置各個啓動運行級別時須要啓動和中止的服務,而在其目錄下K開頭的文件都是開機自動關閉的服務,S開頭的文件都是開機自動啓動的服務。
列出指定crond服務開機啓動各級別是不是自動關閉仍是自動開啓:
[root@magedu ~]# chkconfig --list crond
crond         0:off 1:off 2:on 3:on 4:on 5:on 6:off
三、指定crond服務,在二、三、四、5運行級別時自動啓動
[root@magedu ~]# chkconfig crond on
默認是在二、三、四、5級別進行設置,或單獨指定3和5級別開機時自動啓動:
[root@magedu ~]# chkconfig --level 35 crond on
固然,也可設置crond服務在2/3/4/5運行級別自動關閉,默認也是在二、三、四、5級別進行設置:
[root@magedu ~]# chkconfig crond off
或單獨指定2和4運行級別的自動關閉:
[root@magedu ~]# chkconfig --level 24 crond off
四、自定義服務啓動腳本,並添加到啓動項中 編寫mageserv服務啓動樣例腳本:
[root@magedu ~]# vim /etc/init.d/mageserv
#!/bin/bash
#web

chkconfig: 2345 80 30

description: This is a service script

. /etc/init.d/functions面試

check_num(){
if [ ! $1 -eq 1 ];then
echo "Usage:$0 [start|stop|restart|status]"
exit 1
fi
}express

check_argument(){
if [[ ! $1 =~ ^(start)|(stop)|(restart)|(status)$ ]];then
echo "Usage:$0 [start|stop|restart|status]"
exit 1
fi
}vim

main(){
script_name=mageserv
if [[ $2 = start ]];then
if [ ! -e /var/lock/subsys/${script_name} ];then
touch /var/lock/subsys/${script_name}
action "啓動成功" true
else
echo "啓動成功"
fi
elif [[ $2 = stop ]];then
if [ -e /var/lock/subsys/${script_name} ];then
rm -rf /var/lock/subsys/${script_name}
action "中止完成" true
else
action "中止完成" false
fi
elif [[ $2 = restart ]];then
if [ -e /var/lock/subsys/${script_name} ];then
rm -rf /var/lock/subsys/${script_name}
action "中止完成" true
touch /var/lock/subsys/${script_name}
action "啓動成功" true
else
action "中止完成" false
touch /var/lock/subsys/${script_name}
action "啓動成功" true
fi
elif [[ $2 = status ]];then
if [ -e /var/lock/subsys/${script_name} ];then
echo "$script_name is runing..."
else
echo "mageserv is dead!"
fi
fi
}centos

check_num $#
check_argument $1
main $0 $1
添加執行權限:
[root@magedu ~]# chmod +x /etc/init.d/mageserv
把mageserv服務加入系統服務管裏中:
[root@magedu ~]# chkconfig --add mageserv
添加mageserv服務開機自啓動: ​ [root@magedu ~]# chkconfig mageserv on
或指定35啓動級別時自動啓動:
[root@magedu ~]# chkconfig mageserv off
[root@magedu ~]# chkconfig mageserv on --level 35
注意:改變啓動級別,先關閉啓動運行時的開機自動啓動。 ​ 查看mageserv服務設置的默認啓動級別:
[root@magedu ~]# chkconfig --list mageserv
mageserv 0:off 1:off 2:off 3:on 4:off 5:on 6:off
查看:
[root@magedu ~]# ll /etc/rc?.d/???mageserv
lrwxrwxrwx 1 root root 18 Jul 28 06:31 /etc/rc0.d/K30mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Jul 28 06:31 /etc/rc1.d/K30mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Jul 28 06:34 /etc/rc2.d/K30mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Jul 28 06:35 /etc/rc3.d/S80mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Jul 28 06:34 /etc/rc4.d/K30mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Jul 28 06:35 /etc/rc5.d/S80mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Jul 28 06:31 /etc/rc6.d/K30mageserv -> ../init.d/mageserv
使用系統服務管理service命令管理mageserv服務:
[root@magedu ~]# service mageserv start
啓動成功 [ OK ]數組

[root@magedu ~]# service mageserv restart
中止完成 [ OK ]
啓動成功 [ OK ]bash

[root@magedu ~]# service mageserv status
mageserv is runing...網絡

[root@magedu ~]# service mageserv stop
中止完成 [ OK ]併發

[root@magedu ~]# service mageserv status
mageserv is dead!
固然,也能夠直接使用該服務腳本文件直接運行:
[root@magedu ~]# /etc/init.d/mageserv
Usage:/etc/init.d/mageserv [start|stop|restart|status]app

[root@magedu ~]# /etc/init.d/mageserv start
啓動成功 [ OK ]

[root@magedu ~]# /etc/init.d/mageserv restart
中止完成 [ OK ]
啓動成功 [ OK ]

[root@magedu ~]# /etc/init.d/mageserv status
mageserv is runing...

[root@magedu ~]# /etc/init.d/mageserv stop
中止完成 [ OK ]

[root@magedu ~]# /etc/init.d/mageserv status
mageserv is dead!
注意: 正常級別下,最後啓動一個服務/etc/rc5.d/S99local沒有連接至/etc/rc.d/init.d目錄下的一個服務腳本,而是指向了/etc/rc.d/rc.local腳本。不便或不須要寫爲服務腳本放置於/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置於/etc/rc.d/rc.loal文件中。/etc/rc.d/rc.local在指定運行級別腳本後運行。
該文件是一個軟鏈接:
[root@magedu ~]# ll /etc/rc5.d/S99local
lrwxrwxrwx. 1 root root 11 May 16 17:45 /etc/rc5.d/S99local -> ../rc.local
rc.local文件也是一個軟鏈接:
[root@magedu ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 May 16 17:45 /etc/rc.local -> rc.d/rc.local
因此,最終用戶自定義的一個啓動腳本文件位置是/etc/rc.d/rc.local。 ​ [root@magedu ~]# cat /etc/rc.d/rc.local #!/bin/sh # # This script will be executed after all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff.
touch /var/lock/subsys/local

AWK部分
awk變量 變量:內置和自定義變量 FS:輸入字段分隔符,默認爲空白字符awk -v FS=':' '{print $1,FS,$3}’ /etc/passwdawk –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 NR:記錄號 awk ‘{print NR}’ /etc/fstab ; awk END‘{print NR}’ /etc/fstab
FNR:各文件分別計數,記錄號
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME:當前文件名
awk '{print FILENAME}’ /etc/fstab
ARGC:命令行參數的個數
awk '{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
ARGV:數組,保存的是命令行所給定的各參數
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
awk -F: -f awkscript script=「awk」 /etc/passwd
Printf命令
格式符:與item一一對應
%c:顯示字符的ASCII碼
%d, %i:顯示十進制整數
%e, %E:顯示科學計數法數值
%f:顯示爲浮點數
%g, %G:以科學計數法或浮點形式顯示數值
%s:顯示字符串
%u:無符號整數
%%:顯示%自身
 修飾符
#[.#] 第一個數字控制顯示的寬度;第二個#表示小數點後精度,%3.1f

  • 左對齊(默認右對齊) %-15s + 顯示數值的正負符號 %+d
    賦值操做符:
    =, +=, -=, *=, /=, %=, ^=,++, --
    下面兩語句有何不一樣
    • awk ‘BEGIN{i=0;print ++i,i}’
    • awk ‘BEGIN{i=0;print i++,i}’
    比較操做符:
    ==, !=, >, >=, <, <=
    模式匹配符:
    ~:左邊是否和右邊匹配,包含
    !~:是否不匹配
    示例:
    awk -F: '$0 ~ /root/{print $1}‘ /etc/passwd
    awk '$0~「^root"' /etc/passwd
    awk '$0 !~ /root/‘ /etc/passwd
    awk -F: ‘$3==0’ /etc/passwd
    邏輯操做符:與&&,或||,非!
    示例:
    • awk -F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
    • awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd
    • awk -F: ‘!($3==0) {print $1}' /etc/passwd
    • awk -F: ‘!($3>=500) {print $3}’ /etc/passwd
    條件表達式(三目表達式)
    selector?if-true-expression:if-false-expression
    • 示例:
    awk -F: '{$3>=1000?usertype="Common User":usertype="
    SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
    awk PATTERN
    PATTERN:根據pattern條件,過濾匹配的行,再作處理
    (1)若是未指定:空模式,匹配每一行
    (2) /regular expression/:僅處理可以模式匹配到的行,須要用/ /括起來
    awk '/^UUID/{print $1}' /etc/fstab
    awk '!/^UUID/{print $1}' /etc/fstab
    (3) relational expression: 關係表達式,結果爲「真」纔會被處理
    真:結果爲非0值,非空字符串
    假:結果爲空字符串或0值
    BEGIN/END模式
    BEGIN{}:僅在開始處理文件中的文本以前執行一次
    END{}:僅在文本處理完成以後執行一次
    面試題
    取鏈接主機的ip數量
    ss -nt|awk '/^ESTAB/{print $5}' |awk -F: '{print $1}'
    ss -nt|awk -F"([[:space:]]+|:)" '/^ESTAB/{print $6}'
    ss -nt|awk -F"([[:space:]]+|:)" '/^ESTAB/{print $(NF-2)}'
    下面的命令是要取出連接主機次數最多的ip
    ss -nt|awk -F"([[:space:]]+|:)" '/^ESTAB/{print $(NF-2)}'|sort |uniq -c| sort -nr|awk '{print $2}'|head
    而下面這條命令是要取出全部的ip包括他們的鏈接數:
    ss -nt|awk -F"([[:space:]]+|:)" '/^ESTAB/{print $(NF-2)}'|sort |uniq -c
    Sed 命令取出b開頭的段至f開頭的段
    sed -n '/^b/,/^f/p' /etc/passwd
    awk '/^b/,/^f/' /etc/passwd
    取分區利用率
    df |awk -F"([[:space:]]+|%)" '/^\/dev\//{if($5<10){print $5,"great" }else if($5<80){print $5,"warning"}else{print $5,"error"}}'
    Shell部分
    取100之內的和 一、seq -s+ 100|bc
    二、i=1;sum=0;while [ $i -le 100 ];do let sum+=i;let i++;done;echo $sum
    三、for((sum=0,i=1;i<=100;i++));do let sum+=i ;done;echo $sum
    awk 部分 取100之內的和
    一、awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}'
    二、awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}'
    取最大值 最小值:
    for i in {1..20};do if [ $i -lt 20 ];then echo -n "$RANDOM", ; else echo "$RANDOM" ;fi ;done > num.txt 此處已經得出20個以,隔開的整數了,原本此處爲縱向數列,在第一個echo後加上 -n,就變爲橫向數列
    Awk-F, '{for(i=1;i<=NF;i++){if(i==1){max=$i;min=$i}else{if($i>max)max=$i;if($i<min)min=$i}};print "max="max,"min="min}' num.txt 此處便可打印出max與min的值
    面試題:解決DOS***生產案例:根據web日誌或網絡鏈接數,監控當某個ip併發鏈接數或者短期內pv達到100,即調用防火牆命令封掉對應的ip,監控頻率每隔5分鐘;防火牆命令爲iptables -A INPUT -s IP -j REJECT?
    for ip in ss -nt|awk -F"[[:space:]]+|:" '/^ESTAB/{print $6}'|sort |uniq -c|awk '$1&gt;=3{print $2}';do iptables -A INPUT -s $ip -j REJECT;done
    改寫awk 調用iptables
    參考
    awk 'BEGIN{ip="192.168.35.6";system("iptables -A INPUT -s "ip" -j REJECT")}'
    for ip in awk '{print $1}' /var/log/httpd/access_log |sort |uniq -c|sort -nr|head|awk '{print $2}';do iptables -A INPUT -s $ip -j REJECT;done
    三種方式取值:
    awk -F"/" '{print $3}' url.txt
    cut -d/ -f3 url.txt
    sed -rn 's@.//([^/]+)/.@\1@p' url.txt

Awk部分加{}與不加{}的區別:
[root@centos7 ~]#awk '!line[$0]++{print $0,line[$0]}' f1.txt
aa 1
bb 1
cc 1
aaaa 1
bbb 1
dd 1
[root@centos7 ~]#awk '{!line[$0]++;print $0,line[$0]}' f1.txt
aa 1
bb 1
cc 1
aaaa 1
bbb 1
aa 2
cc 2
dd 1
bb 2
cc 3
aaaa 2
取TCP狀態出現的次數:
[root@centos7 ~]#ss -nta > state.log
[root@centos7 ~]#awk 'NR!=1{state[$1]++}END{for(i in state){print i,state[i]}}' state.log
SYN-RECV 1
LISTEN 59
ESTAB 44
FIN-WAIT-2 1
TIME-WAIT 3593
取男生和女生的平均成績:(兩種不一樣的方法) 1.'NR!=1{if($2=="m"){m_sum+=$3;m_num++}else{f_sum+=$3;f_num++}}END{print "male:"m_sum/m_num,"female:"f_sum/f_num}' score.txt
2.'NR!=1{sum[$2]+=$3;num[$2]++}END{for(i in sum){print i":"sum[i]/num[i]}}' score.txt
m:89.5
f:92.5
統計ip地址出現的次數:
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log

split(s,array,[r]):以r爲分隔符,切割字符串s,並將切割後的結果保存至array所表示的數組中,第一個索引值爲1,第二個索引值爲2,…:netstat -tn | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'

相關文章
相關標籤/搜索