$HOME
P W D ∗ ∗ PWD ** PWD∗∗PS1**
$PS2
fold
join
tr
read
A:&
B:@
C:#
D:$
A:管道
B:输入输出重定向
C:执行后台进程
D:处理程序命令
A:
B:^q
C:exit
D:quit
bash
ruby
PHP
perl
read
pread
write
pwrite
fseek
lseek
-2-time
_2$3
trust_no_1
2004file
为变量赋值:$FRUTT=apple
显示变量的值:fruit=apple
显示变量的值:echo $FRUTT
判断变量是否有值: [-f - - FRUTT || ]
程序后携带了两个位数参数
宏替换
程序后面携带的第二个位置参数
携带位置参数的个数
company = gyyx
$company=gyyx
company='gyyx’
company=gyyx
sed -e ‘/man/d’ filename
sed -e ‘1,3d’ filename
sed -e ‘1,/man/d’ filename
sed -e ‘/man/3d’ filename
n 表 示 程 序 的 第 n 个 参 数 值 ∗ ∗ n 表示程序的第n个参数值 ** n表示程序的第n个参数值∗∗* 表示程序的所有参数个数**
$$表示程序的PID
for filename in (ls)do cat filename done
for((i=0;i<10;i++)) do echo $i done
x=1 sum=0 while [ x -le 10 ] do let sum=sum+x let x=x+1 done echo $sum
for i in 1 2 3 4 5 do echo i done
fold
join
tr
read
break
continue
exit
kill
//
/**/
" "
-x
-u
-f
-p
var1=abcdedf
var2=abcded
echo "var1"|grep -q "var2" && echo "yes" || echo "no"
无结果
语法错误
yes
no
-ne
-ge
-eq
-le
$
n 第n个参数
? 上一条命令的返回状态
* 获取所有参数视为一个参数
$ 当前shell进程号
{#aa} 变量aa值的长度
执行权限
#!/bin/bash
指定脚本运行时的解释器
文件内容无变化
n 第n个参数
! 最后一个后台进程号
* 获取所有参数视为一个参数
@ 获取所有参数,每个参数视为单独的参数
? 上一条命令的返回状态
方法1:
find /var/log/ -type f |wc -l
方法2:
tree /var/log/ |awk 'END{print $3}'
./F1 > F2.txt
#!/bin/sh
CMD="ping -W 2 -c 2"
Ip="192.168.1."
for n in $(seq 254)
do
{
$CMD $Ip$n &> /dev/null
if [ $? -eq 0 ];then
echo "$Ip$n is ok"
fi
}&
done
IP_Address MAC_Address Interface Static
10.66.10.250 80:71:7A:33:CA:A7 br on
10.66.10.249 5C:50:15:7F:3B:F5 br on
将以上文件名称test.txt文件中IP_Address,MAC_Address, Interface三项下的内容取出来,值以“:”分割,并呈格式显示出来
10.66.10.250:80:71:7A:33:CA:A7:br
10.66.10.249:5C:50:15:7F:3B:F5:br
awk 'NR!=1{OFS=":";print $1,$2,$3}' test.txt
直接复制
使用read命令
使用命令行传参
使用命令输出
要求:同一个IP暴力破解超过10次,自动屏蔽IP地址,指定办公室IP地址(192.168.100.100)为可信任IP地址,不受屏蔽规则限制,以下为日志格式:
日志样式:
May 4 03:43:07 tz-monitor sshd{14003}: Failed password for root from 124.232.135.84 port 25251 ssh2
Myy 4 03:43:07 tz-monitor sshd{14082}: invalid user postgres from 124.232.135.84
vim /server/scripts/fairban.sh
#!/bin/bash
awk '/Failed password/{count[$(NF-3)]++}END{for (ip in count) if(count[ip]>=10){print count[ip],ip}}' /var/log/secure > /tmp/count_ip.txt
while read line
do
IP=$(echo $line |awk '{print $2}')
if [ "$IP" != "192.168.100.100" ];then
if ! grep -w $IP /tmp/drop_ip.txt &> /dev/null;then
iptables -I INPUT -s $IP -j DROP
echo $IP >> /tmp/drop_ip.txt
fi
fi
done < /tmp/count_ip.txt
crontab -e
*/5 * * * * /bin/bash /server/scripts/fairban.sh &> /dev/null
ospf 100
route-id 139.11.0.1
area 0.0.0.0
network 139.11.0.1 0.0.0.0
network 140.11.0.0 0.0.0.3
network 140.11.0.8 0.0.0.3
network 140.11.0.16 0.0.0.3
network 140.11.0.24 0.0.0.3
network 140.11.0.32 0.0.0.3
interface LoopBack0
ip address 139.11.0.1 255.255.255.255
#!/bin/bash
route_id=$(grep ospf -A 1 route-id.txt |awk 'NR==2{print $2}')
interface_LoopBack0=$(grep "interface LoopBack0" -A 1 route-id.txt |awk 'NR==2{print $3}')
if [ "$route_id" != "$interface_LoopBack0" ] || ! [[ $route_id =~ ^139.*$ ]];then
echo $route_id
fi
awk '/interface LoopBack0/{getline;print }' ospf.txt
Interface Physical Protocol IP Adderss
Eth1/0/1 up up 199.11.250.1
Eth1/0/2 up up 200.11.250.5
Loop0 up up(s) 199.11.250.1
Vlan1 *down down unassigned
Vlan500 down down 139.100.1.157
Vlan900 up up 140.11.250.41
#!/bin/bash
while read line
do
isnum=$(echo $line | awk -F "[ .]+" '{print $(NF-3)}')
if [[ $isnum =~ ^[0-9]+$ ]];then
if [ $isnum -ne 199 ] && [ $isnum -ne 200 ];then
echo $line | awk '{print $NF}'
fi
fi
done < /tmp/config.txt
http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html
得到如下结果:
域名的出现次数 域名
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
可以使用bash/per/php任意一种
awk -F '/' '{count[$3]++}END{for (url in count) print count[url],url}' url.txt |sort -rn
cd /
find -type f -name "*.log.bak" |xargs tar zcf /tmp/all.tar.gz
ftp -i -n <<FTPIT
open 123.234.25.130
user username_xxx password_xxx
bin
passive
hash
cd /home/bak
lcd /tmp
put all.tar.gz
quit
FTPIT
#!/bin/bash
while read line
do
rm $line -f
done < /root/file.list
csh ksh tcsh bash sh
交互式 非交互式
登录式 非登录式
bash
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)
f(2)
f(3,[3,2,1])
f(3)
[0]
[0, 1]
[3, 2, 1, 0]
[3, 2, 1, 0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0]
[0, 1, 0, 1]
[0, 1, 0, 1, 4]
36.110.86.173 - - [30/Otc2017:09:38:30 +0800] “POST /index.php?r=tuiguang%2Fdelete HTTP/1.1” 200 385 0.036 “http://backend.lepu.cn/index.php?r=tuiguang%2Findex&id=535634“ “Mozilla/5.0 (windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Fecko) Chrome/55.0.2883.87 Safari/537.36” “0.68”
全天PV: 全天UV: PV前十:
UV前十: 499前三: 500前三: 502前三:
全天PV
wc -l access.log
PV前十
awk '{count[$7]++}END{for(pv in count)print count[pv],pv}' access.log |sort -nr |head
499前三
awk '$9==499{count[$7]++}END{for(pv in count) print count[pv],pv}' access.log |sort -nr |head -3
500前三
awk '$9==500{count[$7]++}END{for(pv in count) print count[pv],pv}' access.log |sort -nr |head -3
502前三
awk '$9==502{count[$7]++}END{for(pv in count) print count[pv],pv}' access.log |sort -nr |head -3
(1) 第一个参数为URL,即可下载的文件;第二个参数为目录,即下载后保存位置;
(2) 如果用户给的目录不存在,则提示用户是否创建;如果创建就继续执行,否则函数返回一个51的错误值给调用脚本
(3) 如果给的目录存在,则下载文件;下载命令执行结束后测试文件下载成功,如果成功,则返回0给调用脚本,否则,返回52给调用脚本;
f(){
URL=$1
dir=$2
if [ -d $dir ];then
cd $dir
wget $URL
if [ $? -eq 0 ];then
return 0
else
return 52
fi
else
read -p "是否创建目录(y/n):" res
if [ "$res" = "y" ];then
mkdir $dir -p
f $URL $dir
else
return 51
fi
fi
}
第一行为序列长度n(1≤ n≤ 50)
第二行为n个数scqucencel,以空格分隔
输出描述
输出消除重复元素之后的序列,以空格分隔,行末无空格
输入例子
100 100 100 99 99 99 100 100 100
输出例子
99 100
#!/bin/bash
onum=()
read -a inum -p "请输入数字序列: "
for num in ${inum[*]}
do
if test -z $onum;then
onum+=($num)
else
for num1 in ${onum[*]};do
if ((num1==num));then
flag=1
break
fi
done
if ((flag==1));then
flag=0
continue
fi
onum+=($num)
fi
done
echo ${onum[*]}
class Queue(object):
def enqueue(self,item):
"''""入队""""
def dequcue(self):
""""出队"""
测试
q = Queue()
q.enqueue(1)
输出q [1]
q.enqueue(4)
输出q [1,4]
q.dequeue()
输出14
class Queue(object):
def __init__(self):
self.items = []
def enqueue(self,item):
self.items.append(item)
print(self.items)
def dequeue(self):
l=self.items
for i in l:
print(i,end='')
q = Queue()
q.enqueue(1)
q.enqueue(4)
q.dequeue()
#!/bin/bash
URL="http://download.linekong.com/img/"
for i in {1..100};do
wget $URL${i}.png
done
find -type f -size +500k -name '*.png'
aa,101
bb,302
cc,222
dd,44
sort -t "," -nk2 info.txt
sed -ri '/#|^\s*$/d' info.txt
a.显示当前目录的内容
b.以详细格式显示test用户的家目录内容,包含隐藏文件
c.进入根目录
d.显示/etc/passwd文本文件的内容
e.显示/etc/passwd文件的后十行内容
ls
ls -ali /home/test/
cd /
cat /etc/passwd
tail /etc/passwd
netstat -ant |awk '$1~/^tcp$/{count[$6]++}END{for(state in count)print count[state],state}'
#!/bin/sh
CMD="ping -W 2 -c 2"
Ip="10.10.10."
for n in $(seq 254)
do
{
$CMD $Ip$n &> /dev/null
if [ $? -eq 0 ];then
echo "$Ip$n is ok"
fi
}&
done
vim /etc/init.d/test
#! /bin/bash
#
# test
#
# chkconfig: 2345 10 90
...
chkconfig管理
chkconfig --add test
service调用
service test [start|stop|restart|status]
cat /etc/fstab
UUID=94e4e384-Oace-437f-bc96-057dd64f42ee / ext4 defaults.barrier=0 1 1
tmpfs /dev/shm tmpfs defults 0 0
egrep -o '[a-z]+' /etc/fstab |awk '{count[$0]++}END{for(word in count)print count[word],word}'
列出如下菜单给用户
disk) show disks info;
mem) show memory info;
cpu) show cpu info;
*) quit;
提示用户给出自己的选择,而后显示对应其选择的相应系统信息
#!/bin/bash
while true;do
cat <<-'EOF'
disk) show disks info;
mem) show memory info;
cpu) show cpu info;
*) quit;
EOF
read -p '请输入要查看的信息: ' option
case $option in
disk)
df -h
;;
mem)
free -h
;;
cpu)
lscpu
;;
*)
exit
esac
done
n=1
while [ $n -lt 1000 ]
do
cd /root/perl_test/testdir
touch $n.txt
n=`expr $n + 1`
done
在/root/perl_test/testdir目录下创建1.txt 2.txt 3.txt … 999.txt
如果在/home/pushmail目录下不存在leadtone目录,则创建该目录,并将/var/sync/bin目录下的所有文件拷贝到leadtone目录下,但是不能够拷贝文件长度大于1M的文件
#!/bin/bash
[ -d /home/pushmail/leadtone ] || mkdir /home/pushmail/leadtone -p
find /var/sync/bin -type f ! -size +1M |xargs cp -t /home/pushmail/leadtone/
grep -l 'test' *
history |awk '{count[$4]++}END{for(cmd in count)print count[cmd],cmd}' |sort -nr |head -5
#!/bin/bash
read -p "请输入要检测的脚本: " script
if ! sh -n $script &> /dev/null;then
read -p "${script}有错误,请输入[Q|q]退出: " key
case $key in
Q|q)
exit
;;
*)
vim $script
esac
fi
[ -c file ] && cp file /dev/
#!/bin/bash
. /etc/init.d/functions
RETVAL=0
for n in {01..20}
do
useradd user$n &>/dev/null
RETVAL1=$?
pass=`echo $RANDOM|md5sum|cut -c 2-6`
echo "$pass"|passwd --stdin user$n &>/dev/null && \
echo -e "user$n $pass" >> /tmp/user.txt
RETVAL2=$?
if [ $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ]
then
action "add user is ok" /bin/true
else
action "add user is fail" /bin/false
fi
done
awk '{count[$1]++}END{for(ip in count)print count[ip],ip}' access.log |sort -nr |head
#!/bin/bash
while read line;do
if grep -w $line a &> /dev/null && ! grep -w $line b &> /dev/null ;then
echo $line
fi
done < a
awk '$1~/aaa/{sum+=$2}END{print sum}' test.txt
awk 'NR%2==0{sum+=$2}END{print sum}' test.txt
awk 'BEGIN{max=0}{if($2>max) max=$2}END{print max}' test.txt
case $变量名 in
value1)
cmd1
;;
value2)
cmd2
;;
value3)
cmd3
;;
*)
cmd
esac
while 条件;do
command
done
continue结束当次循环,进入下次循环
#!/bin/bash
cd /opt && {
for((i=0;i<10;i++))
do
SEQ=$(openssl rand -base64 40 |sed 's#[^a-z]##g' |cut -c1-10)
touch ${SEQ}test.html
mv ${SEQ}test.html ${SEQ}test_done.HTML
done
}
case (_____)in
cat $1
cat >>1
*)echo 'defult...'
case
$#
$@
$$
$*
$#
awk '{count[$1]++}END{for(i in count)print count[i],i}' access.log |sort -nr |head
awk '{count[$7]++}END{for(i in count)print count[i],i}' access.log |sort -nr |head
#!/bin/bash
for ((num=2;num<=100;num++));do
flag=0
for ((i=2;i<num;i++));do
if ((num%i==0));then
flag=1
break
fi
done
if ((flag!=1));then
flag=0
echo $num
fi
done
准备环境
echo 3452 > a/aaa.baidu.com
echo 398 > a/bbb.baidu.com
echo 29876 > a/ccc.baidu.com
echo 34 > b/ddd.baidu.com
echo 123 > b/eee.baidu.com
echo 43562 > b/fff.baidu.com
echo 4356299999999999999 > c/ggg.baidu.com
echo 4356223 > c/hhh.baidu.com
echo 6223 > c/iii.baidu.com
#!/bin/bash
for dir in $(ls);do
if [ -d $dir ];then
for file in $(ls $dir);do
cat ${dir}/$file >> /tmp/1000000.log
done
fi
done
sort -rn /tmp/1000000.log |head -1
#!/bin/bash
max=0
read -a num -p "请输入10个数字: "
for i in ${num[*]};do
if ((i>max));then
max=$i
fi
done
echo $max
/usr/bin/fileback
#!/bin/bash
cd /
tar zcf /root/bak/$( date +%Y%m%d)_etc.tar.gz etc
crontab -e
00 00 1 * * /usr/bin/fileback &> /dev/null
ps -ef |awk '$3==105{print "kill "$2}'|bash
history |tail -500 |awk '{count[$2]++}END{for(cmd in count)print count[cmd],cmd}' |sort -n|tail -1
find . -type f -mtime +90 -delete
netstat -antup |awk '$1~/^tcp$/' |awk -F '[: ]+' '{count[$5" "$6]++}END{for(i in count)print count[i],i}' |sort -nr |head -1
ip a
#!/bin/sh
CMD="ping -W 2 -c 2"
Ip="10.10.10."
for n in $(seq 254)
do
{
$CMD $Ip$n &> /dev/null
if [ $? -eq 0 ];then
echo "$Ip$n is ok"
fi
}&
done
nmap -p1-65535 10.10.10.123
#!/bin/bash
DICNAME=ls /root |grep bak #(1) /root目录下过滤bak文件赋值给变量DICNAME
if [ -z "$DICNAME" ] then #(2) 变量DICNAME值是否为空
mkdir /root/bak cd /root/bak #(3) 创建bak并进入bak目录
fi
YY=date +%y MM=date +%m DD=date +%d #(4) 定义三个时间相关的变量
BACKETC=$YY$MM$DD_etc.tar.gz #(5) 定义备份文件变量
tar zcvf $BACKETC /etc #(6) 打包/etc目录
echo "fileback fiaished!"
程序完成功能:备份/etc目录到/root/bak下
#!/bin/bash
max=0
read -a num -p "请输入100个整数: "
for i in ${num[*]};do
if ((i>max));then
max=$i
fi
done
min=${num[0]}
for ((j=1;j<${#num[*]};j++));do
if ((${num[j]}<min));then
min=${num[$j]}
fi
done
for k in ${num[*]};do
((sum+=k))
done
echo $sum
echo $max
echo $min
config.properties文件格式如下
zookeeper.server=127.0.0.1:2181
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://lx-db:3306/gudong
jdbc.username=lanxin
jdbc.password=OnLIDX5
sed -e '/^jdbc.username=/c jdbc.username=blue' -e '/^jdbc.password=/c jdbc.password=pass1234' config.properties
#!/bin/bash
read -p '请输入一个数字: ' num
if [ $num -gt 500 ];then
sh big.sh
else
echo error && exit
fi
http://www.baidu.com/index.html
http://www.baidu.com/1.jpg
http://post.baidu.com/index.php
http://mp3.baidu.com/index.jsp
http://www.baidu.com/3.html
http://post.baidu.com/2.bmp
得到如下结果:
域名的出现的次数 域名
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
awk -F '/' '{count[$3]++}END{for (url in count) print count[url],url}' url.txt |sort -rn
awk -F '.' '$1==172&&$2<=255&&$3==130&&$4<100{OFS=".";print}' ip.txt
mkdir -p {a,b,c}/{d,e,f}/{0..9}
netstat -ant |awk '$1~/^tcp$/{count[$NF]++}END{for (state in count)print count[state],state}' |sort -nr
1 2 3
4 5 6
7 8 9
打印出每一列的累加值
awk '{a+=$1;b+=$2;c+=$3}END{print a,b,c}' test.txt
awk '{for(i=1;i<=NF;i++)sum[i]+=$i}END{for(n in sum)print sum[n]}' test.txt
find /opt/mp3 -type f -name "*.mp3"|xargs md5sum > mp3-md5.txt
(1)查看服务器的硬盘占用量
(2)将/usr/test目录下大于100K的文件转移到/tmp目录下
(3)杀死所有启动的servicefx_asr进程
(4)假设某nginx server的日志access.log如下:
198.24.230.194 - - [10/Oct/2015:10:23:50 +0800] “POST /asr/recognize HTTP/1.1 200 177 “-” ”-”
请查找在2015/10/10,10点这一个小时内,访问“/CheckAuth”接口的IP一共有几个,每个各访问了多少次
df -h
find /usr/test -type f -size +100k |xargs mv -t /tmp/
pkill servicefx_asr
awk '$4>="[10/Oct/2015:10:00:00" && $4<="[10/Oct/2015:10:59:59"{if($7=="/CheckAuth"){count[$1]++}}END{for(ip in count)print count[ip],ip}' access.log
real 0m2.003s
user 0m0.004s
sys 0m0.000s
请说明real、user、sys三者具体代表的意思和区别
real时间是指命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。
user时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。
sys时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。
某目录下有两个文件a.txt和b.txt,文件格式为(ip username),例如:
a.txt b.txt
127.0.0.1 zhangsan 127.0.0.4 lixiaoliu
127.0.0.1 wangxiaoer 127.0.0.1 lisi
127.0.0.2 lisi
127.0.0.3 wangwu
每个文件至少有100万行,请使用Linux命令完成下列工作
1)两个文件各自的IP数,以及总IP数
2)出现再b.txt而没有出现再a.txt的IP
3)每个username出现的次数,以及每个username对应的IP数
awk '{count[$1]++}END{for(ip in count)print count[ip],ip}' a.txt |wc -l
awk '{count[$1]++}END{for(ip in count)print count[ip],ip}' b.txt |wc -l
awk '{count[$1]++}END{for(ip in count)print count[ip],ip}' a.txt b.txt |wc -l
#!/bin/bash
while read line;do
IP=$(echo $line |awk '{print $1}')
if ! grep $IP a.txt &> /dev/null;then
echo $IP
fi
done < b.txt
awk '{count[$2]++}END{for(user in count)print count[user],user}' a.txt b.txt
vim /usr/bin/start.sh
#!/bin/bash
case "$1" in
start)
if ss -lntup |grep 8038 &> /dev/null;then
echo "ab-service is running"
else
ab-service start &>> /var/log/ab-server.log
if ss -lntup |grep 8038 &> /dev/null;then
echo "ab-service start succese !"
else
echo " ab-service start fail !!!"
fi
fi
;;
stop)
if ss -lntup |grep 8038 &> /dev/null;then
ab-service stop &>> /var/log/ab-service.log
if ! ss -lntup |grep 8038 &> /dev/null;then
echo "ab-service stop succece!"
else
echo "ab-service stop fail !!!"
fi
else
echo "ab-service is stopped"
fi
;;
*)
echo $"Usage: $0 {start|stop|status|restart|force-reload}"
esac