工作中shell脚本,经常用的语法,整理了下
1 echo带色的 打印字符串带色(31红色,32绿色,33黄色,34蓝色)
打印字符串背景带色 (40黑色,41红色,42绿色,黄色43,蓝色44,白色47)
echo -e “\e[31;43m Hello Word\n Hello word \e[0m”
echo -e “\e[31;43m Hello Word\n Hello word \e[0m”
export PS1=”[\e[31;40m\u\e[0m \e[32;40m@\h\e[0m \e[33;40m\W\e[0m]”2添加常用目录为PATH的查找目录
PATH=”PATH:/home/gongzuo/”exportPATH3获取变量的长度echo{#HOME}
4 修改系统中的一些常用变量(如PS1)对所有用户永远生效
vim /etc/profile
PS1=”test@Chenyd”
test@Chen_dd#source /etc/profile
5 算术运算
(1)echo [3+2]echo(( 3 + 2 ))
(2)test@Chenyd>let a=4+3;echo atest@Chenyd>a=1;leta+=6;echoa
(3)echo “3*4.12”|bc
echo “scale=2;13/8”|bc ###scale设置精确到极为小数
test@Chenyd>a=100;echo “obase=2;$a”|bc #####进制转化
6 打印信息分类
cat a.* 2>err.log 1>stbout.log ###标准输出重定向到stbout.log,标准错误重定向到err.log
7 数组
a=(1 2 3)
echo a[∗]echo{a[2]}
echo a[1]8显示时间格式date“+date+9脚本参数@ 一次性打印所有参数,作为一个实体
∗一次性打印所有参数,单个参数作为一个实体? 检测是否执行成功,成功打印0
$# 总计几个参数
10 函数格式
function test()
{
echo “test test”
}
test
11 read
(1)read -p “plesase input number” a
echo a
(2)read -n 5 a #输入5个字符自动结束
echoa
12 find命令
find /root/cyd/ ! -name “*.sh”
find . -maxdepth 2 -name test.sh #从当前目录向下查2级目录
find . -mindepth 15 -name “*” #查看15级目录往后的所有
find . -type d #列出从当前目录开始所有目录 (f 普通文件,c字符设备,b块设备,s套接字,p是FIFO)
find . type f -atime -7 最近7天被访问过的文件(-mtime修改时间,-ctime变化时间)
find . -type f -size +2M #打印大于2M的文件,(-2M 是小于)
find . -name sum.sh -delete #找到并删除
find /var/www/error/ -name “*.var” -exec cat {} \; #找出所有的error文件并cat
find . -type f -name test.sh | xargs cat; #与exec类似
find . -type f -name test.sh | xargs -0 rm -rf #-0是说明定界符是\0的
13 tr命令(字符串替换)
echo 123 |tr ‘0-9’ ‘9876543210’ #加密
echo 123 |tr ‘9876543210’ ‘0-9’ #解密
echo 12311aaaaaaaaa | tr -d ‘0-9’ #-d参数删除‘0-9’的字符
14 sort和unqi
cat a.txt |uniq -c|sort -r #去重复行并显示重复次数,逆向排序
15 分割文件
split -b 10k date.file #把date.file分割成多个10k大小的文件
split -b 1k data.file -d -a 4 file #定义前后缀名
16 批量重命名文件名
find . -type f -exec rename ‘s/ /_/g’ {} \; #将当前目录中文件名中的空格替换为下划线
eg:
count=1
for i in find . -iname "*.log"
do
new=error-countecho“Renamei to new”mvi $new
let count++
done
17 dd命令(测试磁盘性能,备份数据,清除数据,写固定文件)
dd if=/dev/zero of=test.file bs=1M count=1
18 comm 对比两文件中字符的差异(默认输出3块,第一块是a中有的,第二是b中有的,第三是ab都有的)
comm a b
comm a b -1 -2 #删掉ab不同的字符,输出ab相同的字符
comm a b -3 |sed ‘s/^\t//g’ #输出ab不同的字符,sed屏蔽字符前的空格
19 环回文件系统 :指把一个文件格式文件系统后,挂载后使用(非实体硬件)
20 wc命令
cat file |wc -l #统计行数
cat file |wc -w #统计单词数
21 正则
^起始结束 [^ab]除ab之外的字符 [ab]a与b之间选一个 {n,m} 匹配n到m次
? 匹配之前项0到1次 +匹配1到多次 *匹配0到多次
22 grep使用正则(egrep和grep -E)
egrep –color=auto -n “W[Ei]+” /home/conf/bds-config.xml
egrep -o –color=auto -n “[0-9]{1,3}.[0-9]{1,3}.[0-9]{3}.[0-9]{1,3}” /home/bds/conf/bds-config.xml #找出iP地址
grep 参数 -n打印前带行数 -c统计行数 -A 3 打印匹配字符之后的3行,-B 3打印字符匹配之前的3行, -V打印不包括字符的其他行
-A 1 添加—的定界符
23 cut -d ’ ’ -f3 #-d添加定界符 -f显示第三列
24 sed
sed ‘s/var1/var2/’ file #替换每一行匹配的第一个匹配项
sed ‘s/var1/var2/g’ file #替换所有匹配的内容
sed ‘s/var1/var2/ng’ file #替换每行从匹配的第n处开始
sed ‘s/^/d’ file #移除空白行
sed ‘s/aa/&BB/’ file #&表示之前匹配到的字符。
25 awk
awk ‘BEGIN { print “start”} {print } END{print “end”}’
awk -F “:” ‘{ print $2 }’ #定界符
26 dhclient em1 动态通过dhcp获取ip地址
ifconfig |cut -c-10|tr -d ’ ’ |tr -s ‘\n’ #打印前10个字符,tr -d删除每行空格,tr -s 压缩空格行
route add default gw 1.1.1.1 em1
ping -c 2 #-c尝试2次
27 ssh
ssh root@1.1.1.1 ‘command’ #直接传命令向远端服务器
ssh root@1.1.1.1 -p 422
28 lsof
lsof -i:8080
lsof -i
29 套接字
nc -l 1234 #监听服务器
nc host—ip 1234 #连接端
30 time
time sh a.sh #记录a.sh执行完的时间
31 last 列出上一次启动用户登录的信息
lastb 登录失败的信息
32 watch ‘ls -l’ #监控这个目录的文件,
33 logrotate 将日志文件轮询限制在一定的大小里。
34 ps -eo pcpu,pid, #e是every o是制定输出的列
ps -eo comm,pid,pcpu –sort -pcpu|head -n 20 #sort对输出的列排序,+—— 是排序方式。
pgrep httpd #打印进程号
35 kill
pkill httpd #按进程名字kill
36 top
top -Hp pid -bn1|grep daemgr|awk '{print $(NF),$1,(NF-3),$(NF-2)}' #实时提取top中pid该进程的command,pid,cpu%,mem%
37 在shell中执行sql语句
(1)mysql –user=root –password=passwd–database=bds−e“select∗fromsamplelimit10”(2)echo“selectcount(∗)fromsample”|mysql−uroot−ppasswd –database=bds
(3)mysql正则的用法
mysql -uroot -p$passwd –database=bds -e “select * from sample where sample_name REGEXP ‘[fav]orm*’”;
select sample_name from sample where sample_name like ‘%ac%’;
38 mysql基本语法
1delete: DELETE FROM runoob_tbl WHERE sample_id=3;
2update: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
update tcphdr set sid=3 where cid=’39’;
3insert:insert into samples values (‘1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’); #新增加一行,按列的多少和类型填入
4alert:alter table aaa add age char; #新添加一列
5 create database cyd;
6 create TABLE CHEN (ID INT, NAMN CHAR, TIME DATE);
7 select max(id) as max_id from aaa; #函数用法
8 select * from aaa where name in (‘A’,’B’); #取出name是AB的行
9 select SUM(id) as sum from aaa;
10 select id from aaa order by id;
11 select id from aaa order by id desc; #逆序排序
12 select name,sum(sale) as total from aaa group by name; #按名字排序消费总和
13 ELECT ns_app_ptl,count(ns_app_ptl) as count FROM network_session GROUP BY ns_app_ptl ORDER BY count asc limit 10;
order by count asc 从小到大排序
order by count desc 从conut列的大到小排序
GROUP BY ns_app_ptl 按ns_app_pt1列中的类型统计计数。
39 tcpdump
tcpdump -i em4 dst port 25 or src port 25
40 tcpreplay
tcpreplay -i em2 smtp.pcap03 (em2和em3环起来,在em2回放,em3上去监听)
41 tar的打包与解包
(1)打包:tar -z(j)cvf xxx.tar.gz /root/kaifa/*
(2)解包:tar -zxvf xxx.tar.gz
#####z表示有gzip属性,j表示有bzip2属性。c是create打包 v列出详情,r是追加(向已经有的压缩文件中加文件)f文件的名字(这个名字是自己定义的) + 打包的文件or目录
(3) rar 压缩rar xx.rar *.jpg
解包unrar e xx.rar
(4) zip 压缩 zip xx.zip /home/kaifa/*
解包 unzip xx.zip
42 route (U 是路由,GU是网关)
route按主机名称列出来
route add default gw 192.168.1.2
route -n 按网络地址列出来
route add -net 10.11.1.0/8 gw 192.168.3.1 dev em1 添加路由
route add -net 172.168.1.0 netmask 255.255.0.0 reject 添加拒绝路由
route del -net 10.0.0.0 netmask 255.0.0.0 reject 删除拒绝路由
43 img转成qcow2
qemu-img convert -f raw centos.img -O qcow2 centos.qcow
44.exce和xargs
[root@LanyEye cyd]# find ./ -type f|xargs ls -l
[root@LanyEye cyd]# find ./ -type f -exec ls -l {} \;
ps -ef | grep suricata |grep -v grep| awk ‘{print $2}’ | xargs -i kill {}
45 打印出16进制的
附:实例
#扫描局域网中存活的主机个数
#!/bin/bash
#file-name:ip_scan.sh
for ip in 192.168.9.{1..254};
do
ping $ip -c 2 2>&1 >/dev/null
if [ $? == 0 ]
then
echo $ip >>alive.txt #存活的主机写入alive文件
else
echo $ip >>error.txt #不存活的自己写入error文件
fi
done