9.11-Linux中的date,cut,awk,awk程式設計
linux中的日期格式:
x:正數是多少單位以前,負數的時候多少單位以後
x hours ago
x days ago
x weeks ago
x months ago
x years ago
獲取天:
獲取時間戳:
echo `date -d "1 hours ago" "+%Y-%m-%d %H:%M:%S"`
echo `date -d "-1 hours ago" "+%Y-%m-%d %H:%M:%S"`
echo `date -d "1 weeks ago" "+%Y-%m-%d"`
echo `date -d "1 weeks ago" "+%d"`
echo `date -d "1 weeks ago" "+%m"`
echo `date -d "1 weeks ago" "+%s"`
模式:date [option] " 定位某天( ....ago ) " "+時間的格式 "
定時任務列表:
crontab -e : 編輯當前使用者的定時任務列表
crontab -e -u gj : -u指定編輯gj使用者的定時任務列表
crontab -l : 檢視當前使用者的定時任務列表
crontab -l -u gj : 檢視gj的定時任務列表
crontab -r : 刪除當前使用者的定時任務列表
crontab -r -u gj :刪除gj的定時任務列表 (-i 給出確認刪除提示)
* * * * * 可執行的指令碼或者可執行的命令 資訊處理
分 時 天 月 周
1,2,3 1-10/2
* : 任意單位
*/n : 每隔n個單位
1,2,3 :在1,2,3單位
1-10 : 1到10的連續單位
1-10/2 :1-10的連續單位每隔兩個單位
30 02 * * * /home/my.sh >> /home/my.log
*/1 * * * * /bin/echo "hello gp1813" >> /home/my.log
*/1 * * * * /home/my.sh >> /home/my.log
crontab -l -u root : 為root建立定時任務列表
crontab -l -u root : 檢視root使用者的定時任務列表
crontab -r -u root : 刪除root的定時任務列表
crontab -e -u gj :給gj建立定時任務列表
crontab -r -u gj :刪除gj定時任務列表
快照:在某一時刻給系統拍一張照片(某時刻系統映象)
克隆:複製一臺和另一臺機子一模一樣的伺服器。
關鍵--->管理--->克隆--->下一步--->克隆當前狀態--->建立完整克隆(修改名稱和儲存地方)
修改克隆機子的ip資訊:
vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改eth0網絡卡資訊
vi /etc/sysconfig/network 修改的主機名
vi /etc/hosts : 配置對映
vi /etc/udev/rules.d/70-persistent-net
目的:
window能ping通克隆出來的每一臺伺服器
克隆出來的每一臺機子和原來的需要能通訊
作業:
案例1:面試題中的shell題
第一種方法:(rename 一定需要走到當前目錄,否則錯誤)
rename .txt '' /home/shell/*.txt
第二種方法:(注意find不能用就換/bin/sh、注意執行指令碼需要傳引數)
find $basedir -name '*.txt'
第三種方法:(採用迴圈mv的方式來做??較為麻煩)
#!/bin/bash
basedir=/home/shell
for i in ` ls *.txt`
do
finalname=`basename $i .txt`
mv ${dir}$i ${basedir}/$finalname #遇見相同名不會修改
done
案例2:(每天凌晨2點10分定時刪除一週前的日誌檔案)
日誌格式為:
touch 2018-09-01.log
touch 2018-09-02.log
touch 2018-09-03.log
touch 2018-09-04.log
touch 2018-09-05.log
touch 2018-09-06.log
touch 2018-09-07.log
touch 2018-09-08.log
#!/bin/bash
#獲取今天以前七天的時間戳
weekagoTimeStamp=`date -d "1 weeks ago" "+%s"`
basedir=/home/log
for i in `ls $basedir`
do
nowdate=`basename $i .log`
logTimeStamp=`date -d "$nowdate" "+%s"`
if [ $logTimeStamp -lt $weekagoTimeStamp ]
then
echo $i
rm -rf $basedir/$i
fi
done
awk : linux中三把斧頭之一,grep主要用於過濾,sed主要用於流編輯,awk主要用於資料分析。
awk常見pattern:
awk -F "" 'BEGIN{} {}... END{}'
awk -F "" '{}... END{}'
awk -F "" '{}...'
-F : 後面是指定列的分割符,預設的域分隔符是空格
awk的常見用法:
1、直接在linux控制中使用命令
資料來源 | awk -F "" 'BEGIN{} {}... END{}'
awk -F "" 'BEGIN{} {}... END{}' 資料路徑
2、將awk語句巢狀在shell指令碼中執行 ,sh ./first.sh
3、直接使用awk呼叫指令碼 awk -f ./first.awk
常見操作:
cat /etc/passwd | awk -F ":" '{if($3>=500) print $0}' 輸出整行
cat /etc/passwd | awk -F ":" '{print $1,$3,$4}' 指定輸出域
cat /etc/passwd | awk -F ":" '{if($1=="root") print $1,$3,$4}' : 第一個欄位等root的行
cat /etc/passwd | awk -F ":" 'BEGIN{print "uname\tuid\tgid"} {if($3>=500) print $1"\t"$3"\t"$4}' : 指定begin,僅執行一次
cat /etc/passwd | awk -F ":" 'BEGIN{print "uname\tuid\tgid"} {if($3>=500) print $1"\t"$3"\t"$4} END{print "all data proccessed finished"}' : 指定end,僅執行一次,僅執行一次
cat /etc/passwd | awk -F ":" '{if($1 ~ /^root/) print $1,$3,$4}' : 正則匹配 $n ~ /正則表示式/
cat /etc/passwd | awk -F ":" '{if($1=="root") print $1,$3,$4}' : 精確匹配
條件表示式:> < = != 等
作業:
zs1 68 99 33
zs2 78 90 70
zs3 88 78 99
zs4 58 90 69
zs5 18 66 66
1、查找出不及格的學生(有任何一科不及格為不及格)
awk -F "\t" '{if($2<60 || $3 < 60 || $4 < 60) print $0}'
2、計算出每一個科目平均分?
3、計算出每一個學生的平均分?
#!/bin/awk -f
BEGIN{
math=0
engish=0
chinese=0
print "name\tmath\tenglish\tchinese\tstu_avg\n"
# print "------------------------------------------"
}
{
math+=$2
english+=$3
chinese+=$4
print $1"\t"$2"\t"$3"\t"$4"\t"($2+$3+$4)/NF
}
END{
# print "------------------print avg------------------"
printf "o_avg:%6.2f%8.2f%8.2f\n",math/NR,english/NR,chinese/NR
}
執行:awk -f avg.awk score.txt
模式:awk -f awk指令碼 需要操作的檔案
4、計算出平均分數落在分段數的人數及比例?
awk -F "\t" '
BEGIN{
ltFifty=0
gtFiftyltSixty=0
gtSixtyltNinty=0
gtNintyltHun=0
}
{
if(($2+$3+$4)/(NF-1) < 50){
ltFifty++
} else if(($2+$3+$4)/(NF-1) < 60){
gtFiftyltSixty++
} else if(($2+$3+$4)/(NF-1) < 90){
gtSixtyltNinty++
} else if(($2+$3+$4)/(NF-1) <= 100){
gtNintyltHun++
}
}
END{
print "0-50",ltFifty,(ltFifty/NR)*100"%"
print "50-60",gtFiftyltSixty,(gtFiftyltSixty/NR)*100"%"
print "60-90",gtSixtyltNinty,(gtSixtyltNinty/NR)*100"%"
print "90-100",gtNintyltHun,(gtNintyltHun/NR)*100"%"
}
'
這是命令,不是awk指令碼,可以直接執行命令,也可以把主要內容寫在awk腳本里,用awk -f ---執行即可。
awk的內建變數:
NR :獲取檔案的行數
NF : 獲取每行的欄位數
FS : 輸入資料域分割符
OFS :輸出資料的欄位分隔符
ORS : 輸出記錄的欄位分隔符
ARGC : 命令列的引數個數
awk 'BEGIN{ FS=":";OFS="=" } {print $1,$3}' /etc/passwd
awk中的條件語句:
if(){
}
awk中的for迴圈:類似c
awk -F ":" 'BEGIN{count=0} {name[count]=$1;count++} END{for(i=0;i<NR;i++) print i,name[i]}' /etc/passwd
使用awk統計詞頻:
awk -F " " '{for(i=1;i<=NF;i++) arr[$i]++} END{for(word in arr) print word,arr[word]}' /home/words
awk的格式化輸出:
printf("is is d%",NF)
編寫自動化指令碼?
執行某一個指令碼,將所有你指定的伺服器的jdk安裝好 scp 、 ssh 、 expect
網路配置:
防火牆:控制主機是否能"出、入"
配置檔案
/etc/sysconfig/iptables
檢視防火規則:
iptables -L
插入一條防火規則:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT 允許80端
iptables -A INPUT -p tcp --dport 80 -j DROP 拒絕80
儲存防火規則:
iptables-save
檢視埠:
netstat -nltcp | grep 80
netstat -nludp
lsof -i:80 : 列出埠80
route:
route 檢視路由
route add ...
route del ...
cut:
cut -b 1 /etc/passwd
cut -c 1 /etc/passwd
cut -d ":" -f 1,3,4 /etc/passwd >> /home/data
sed:linux的流式編輯器
增、刪、改、查、替換