1. 程式人生 > >9.11-Linux中的date,cut,awk,awk程式設計

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的流式編輯器
 增、刪、改、查、替換