1.5笔记
[root@node1 ~]# cat /etc/shells
bash -x 显示脚本的执行过程
-v 执行前打印内容
-n 检查语法,不执行
执行方法
[root@node1 ~]# ./a.sh
[root@node1 ~]# sh a.sh
[root@node1 ~]# source a.sh
变量命名
只能使用英文字符,数字和下划线,首个字符不能以数字开头,变量名中间不能有空格,使用下划线替代,不能使用标点符号,不能使用bash里的关键字, 变量名尽量有意义
变量名=值
echo $变量名
unset 变量名
[root@node1 ~]# find / -name `uname -r`
#!/bin/bash
read -p "your ipaddress: " IP
ifconfig eth0 $IP
export a 声明为全局变量
运算
+ - \* / %
[root@node1 ~]# num1=`expr 5 + 4`
[root@node1 ~]# echo $num1
9
[root@node1 ~]# num2=`expr 5 - 4`
[root@node1 ~]# echo $num2
1
[root@node1 ~]# num3=`expr 5 \* 4`
[root@node1 ~]# echo $num3
20
[root@node1 ~]# num4=`expr 8 / 4`
[root@node1 ~]# echo $num4
2
[root@node1 ~]# num5=`expr 5 % 4`
[root@node1 ~]# echo $num5
1
[root@node1 ~]# num6=`expr 5 / 4`
[root@node1 ~]# echo $num6
1
位置变量
#!/bin/bash
tar zcf /tmp/test.tar.gz $* &> /dev/null
echo mulu: $*
echo zongji:$#
dhcp安装脚本
#!/bin/bash
umount /dev/sr0 &> /dev/null
mount /dev/sr0 /mnt &> /dev/null
mkdir /etc/yum.repos.d/repo
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo
echo "[server]" > /etc/yum.repos.d/server.repo
echo "name=server" >> /etc/yum.repos.d/server.repo
echo "baseurl=file:///mnt" >> /etc/yum.repos.d/server.repo
echo "enabled=1" >> /etc/yum.repos.d/server.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/server.repo
echo "server.repo is done"
yum clean all &> /dev/null
yum install dhcp* -y &> /dev/null
echo "dhcp is done"
ls --color /etc/yum.repos.d/
rpm -qa | grep dhcp
read -p "subnet" NET
echo "subnet $NET netmask $NETMASK {" > /etc/dhcp/dhcpd.conf
systemc start .......
计划任务
logbackup.sh
tar fcz 2023-01-25.tar.gz /var/log/messages
crontabe -e
30 2 * * 0/7 /opt/logbackup/logbackup.sh
test命令
文件
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(excute)
[root@node1 ~]# [ -d /etc ]
[root@node1 ~]# echo $?
0
[root@node1 ~]# [ -d /etc/passwd ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# [ -f /etc/passwd ]
[root@node1 ~]# echo $?
0
&& || ; !
-o or 有一个表达式为true,则返回true
[root@node1 ~]# [ -d /boot/a ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# [ -d /etc -o -d /boot/a ]
[root@node1 ~]# echo $?
0
-a and 两个表达式都为true,才返回true
[root@node1 ~]# [ -d /etc -a -d /boot/a ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# [ -d /etc -a -d /boot ]
[root@node1 ~]# echo $?
0
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-ge:大于或等于(Greater or Equal)
-le:小于或等于(Lesser or Equal)
[root@node1 ~]# [ $a -eq $b ]
[root@node1 ~]# echo $?
1
= 内容相同
!= 内容不相同
-z 内容为空
[root@node1 ~]# [ -z "$a" ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# echo $a
10
[root@node1 ~]# unset a
[root@node1 ~]# [ -z "$a" ]
[root@node1 ~]# echo $?
0
if.sh
#!/bin/bash
if [ -e /etc/passwd ]
then
echo "yes"
fi
if2.sh
#!/bin/bash
if [ -e /mnt/Packages ]
then
echo "mounted"
else
umoun /dev/sr0
mount /dev/sr0 /mnt &> /dev/null
fi
if3.sh
#!/bin/bash
read -p "chengji: " A1
if [ $A1 -ge 80 ]
then
echo good
elif [ $A1 -lt 80 ]&&[ $A1 -ge 60 ]
then
echo jige
else
echo bujige
fi
for
批量添加用户
建立用户列表
test1
test2
test3
#!/bin/bash
for i in `cat /root/user.txt`
do
useradd $i
echo "123456" | passwd --stdin $i &> /dev/null
done
for2.sh 判断奇数偶数
#!/bin/bash
for i in 11 22 33 44 55 66
do
a1=`expr $i % 2`
if [ $a1 -eq 1 ]
then
echo jishu,$i
else
echo oushu,$i
fi
done
建立ip.txt文档
for3.sh
#!/bin/bash
for i in `cat /root/ip.txt`
do
ping -c 3 $i &> /dev/null
if [ $? -eq 0 ]
then
echo $i is huozhe
else
echo $i is guale
fi
done
while
while1.sh
#!/bin/bash
i=1
while [ $i -le 20 ]
do
echo $i >> /root/test.txt
let i++
done
while2.sh 建立用户
#!/bin/bash
i=1
while [ $i -le 20 ]
do
useradd stu$i
#userdel -r stu$i
echo "123456" | passwd --stdin stu$i &> /dev/null
let i++
done
while3.sh 猜数字
#!/bin/bash
i=0
jiage=`expr $RANDOM % 1000`
while true
do
let i++
read -p "geichu jiage 0-999: " int
if [ $int -eq $jiage ]
then
echo "gongxi $jiage,yigong $i ci"
exit 0
elif [ $int -gt $jiage ]
then
echo "duole"
else
echo "shaole"
fi
done
case
#!/bin/bash
read -p "input a num: " NUM
case $NUM in
1)
echo "your num is 1"
;;
2) echo "your num is 2"
;;
[3-8])
echo "your num is $NUM"
;;
9|0)
echo "your num is $NUM"
;;
*)
echo "input a num [0-9]"
esac
[a-z][A-Z]
case2.sh
#!/bin/bash
read -p "input a key: " key
case $key in
[a-z]|[A-Z])
echo "your key is $key"
;;
[0-9])
echo "your key is $key"
;;
*)
echo "zi mu huo shu zi"
esac
case3.sh
#!/bin/bash
case "$1" in
start)
echo -n "starting......."
if sleep 7200 &
then
echo "OK"
fi
;;
stop)
echo -n "stopping....."
pkill "sleep" &> /dev/null
echo "OK"
;;
status)
if pgrep "sleep" &> /dev/null
then
echo "sleep is starting"
else
echo "sleep is guale"
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "useage: $0 {start|stop|status|restart}"
esac
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the li
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
grep -n 'the' test.txt 查找the并显示行号
grep -ni 'the' test.txt 查找the并不区分大小写
grep -nv 'the' test.txt 反向查找不包含the的行
grep -n 'sh[io]rt' test.txt 查找包含shirt和short的行
grep -n 'oo' test.txt 查找重复单个字符’oo’的行
grep -n '[^w]oo' test.txt 查找’oo’前面不是’w’的行
grep -n '[^a-z]oo' test.txt 查找’oo’前面不是小写字母的行
grep -n '[^A-Z]oo' test.txt 查找’oo’前面不是大写字母的行
grep -n '[0-9]' test.txt 查找包含数字的行
grep -n '^$' test.txt 查找空行
grep -n 'w..d' test.txt 查找以’w’开头,'d’结尾共4个字符的行
grep -n 'ooo*' test.txt 查询至少包含两个o以上的字符串
grep -n 'woo*d' test.txt 查找以’w’开头,中间至少包含一个’o’的,'d’结尾的行
grep -n 'w.*d' test.txt 查找以’w’开头,'d’结尾,中间字符可有可无的行
grep -n '[0-9][0-9]*' test.txt 查询任意数字的行
grep -n 'o\{2\}' test.txt 查看2个o的字符
grep -n 'wo\{2,5\}d' test.txt 查看以’w’开头,'d’结尾,中间为2,5个o的字符串
扩展正则
grep -n -Eo 'wo+d' test.txt 执行该命令即可查询到"wood","woood","wooooood"等字符串
grep -n -Eo 'bes?t' test.txt 执行该命令即可查询到"bet""best"这两个字符串
grep -n -Eo 'of|is|on' test.txt 执行该命令即可查询到"of",或者"is",或者"on"字符串
grep -n -Eo 't(a|e)st' test.txt "tast"与"test"因为这两个单词的"t"与"st"是重复的,所以将"a"与"e"列入"()"符号当中,并以"|"分隔,即可查询"tast"或者"test"字符串
grep -n -Eo 'A(xyz)+C' test.txt 该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意识
\t 制表符 tab
\n 换行符 回车
sed
-e 可以在同一行里执行多条命令
echo 'hello world' | sed -e 's/hello/A/' -e 's/world/B/'
-f 还记得 -e 选项可以来执行多个子命令操作,用分号分隔多个命令操作也是可以的,如果命令操作比较多的时候就会比较麻烦,这时候把多个子命令操作写入脚本文件,然后使用 -f 选项来指定该脚本
echo "hello world" | sed -f sed.script
sed.script内容
s/hello/A/
s/world/B/
-n sed默认会把模式空间处理完毕后的内容输出到标准输出,也就是输出到屏幕上,加上-n选项后被设定为安静模式
echo -e 'hello world\nnihao' | sed 's/hello/A/'
echo -e 'hello world\nnihao' | sed -n 's/hello/A/'
-i sed默认会把输入行读取到模式空间,简单理解就是一个内存缓冲区,sed子命令处理的内容是模式空间中的内容,而非直接处理文件内容。因此在sed修改模式空间内容之后,并非直接写入修改输入文件,而是打印输出到标准输出。如果需要修改输入文件,那么就可以指定-i选项
cat ceshi.txt
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
p 命令
命令 p 是打印命令,用于显示模式缓存区的内容。默认情况下, sed 把输入行打印在屏幕上,选项-n 用于取消默认打印操纵。当选项-n 和命令 p 同时出现时, sed 可打印选定的内容
sed -n '/north/p' ceshi.txt
d命令
命令 d 用于删除输入行。sed 先将输入行从文件复制到模式缓存区,然后对该行执行 sed命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示。
sed '3d' ceshi.txt 删除第 3 行。默认情况下,其余的行都被打印到屏幕上。
sed '3,$d' ceshi.txt 删除从第三行到最后一行内容,剩余各行被打印。地址范围是开始第 3 行,结束最后一行。
sed '/north/d' ceshi.txt 所有包含模式 north 的行都被动删除,其余行被打印
s 命令
命令 s 是替换命令。替换和取代文件中的文本可以通过 sed 中的 s 来实现, s 后包含在斜杠中的文本是正则表达式,后面跟着的是需要替换的文本。可以通过 g 标志对行进行全局替换
sed 's/west/north/g' ceshi.txt s 命令用于替换。命令末端的 g 表示在行内全局替换;也就是说如果每一行里出现多个west,所有的 west 都会被替换为 north。如果没有 g 命令,则只将每一行的第一 west 替换为 north。
sed -n 's/^west/north/p' ceshi.txt s 命令用于替换。选线-n 与命令行末尾的标志 p 结合,告诉 sed 只打印发生替换的那些行;也就是说,如果只有在行首找到 west 并替换成 north 时才会打印此行。
sed 's/[0-9][0-9]$/&.5/' ceshi.txt 当"与"符号( &)用在替换串中时,它代表在查找串中匹配到的内容时。这个示例中所有以 2 位数结尾的行后面都被加上.5。
a 命令
a 命令是追加命令,追加将新文本到文件中当前行(即读入模式的缓存区行)的后面。不管是在命令行中,还是在 sed 脚本中, a 命令总是在反斜杠的后面。
sed '/^north/a Hello world!' ceshi.txt 命令 a 用于追加。字符串 Hello, World!被加在以 north 开头的各行之后。如果要追加的内容超过一行,则除最后一行外,其他各行都必须以反斜杠结尾。
i命令
将数据插入到某个位置之前
sed '/north/i AAAAA' ceshi.txt
c命令
将匹配行的内容替换为指定的数据
sed '/north/c AAAAA' ceshi.txt
y命令
字符按照一对一的方式从左到右进行转换
sed 'y/abc/ABC/' ceshi.txt
awk
FS 分隔符 默认是空格
NF 子段的数
NR 行号 默认从1开始
$0 完整输入记录
$n 当前记录的第n个子段
FILENAME 文件名
RS 记录分隔符--默认为换行符
-F 指定分割符