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的流式编辑器
增、删、改、查、替换