shell中字符串
- 字符串可以用单引号,也可以用双引号,也可以不用引号
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)
- 双引号里可以有变量
- 双引号里可以出现转义字符
建立软硬链接
ln [参数] [源文件] [目标文件]
软链接:
1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
2.软链接可以 跨文件系统 ,硬链接不可以
3.软链接可以对一个不存在的文件名进行链接
4.软链接可以对目录进行链接
硬链接:
1.硬链接,以文件副本的形式存在。但不占用实际空间。
2.不允许给目录创建硬链接
3.硬链接只有在同一个文件系统中才能创建
# 给文件创建软链接,为log2013.log文件创建软链接link2013,如果log2013.log丢失,link2013将失效:
ln -s log2013.log link2013
# 文件创建硬链接,为log2013.log创建硬链接ln2013,log2013.log与ln2013的各项属性相同
ln log2013.log ln2013
echo
# 用于字符串的输出
echo string
echo "It is a test" 或者
echo It is a test
# 显示变量
#!/bin/sh
read name
echo "$name It is a test"
# 显示换行
echo -e "OK! \n" # -e 开启转义
echo "It is a test"
#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
# 显示结果定向至文件,会覆盖原有文件内容
echo "It is a test" > myfile
# 内容追加到文件末尾 换行追加
echo "It is a test" >> myfile
# 显示命令执行结果
echo `date`
tail
tail [参数] [文件]
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示文件的尾部 n 行内容
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
# 默认显示最后 10 行
tail notes.log
# 跟踪名为 notes.log 的文件的增长情况
tail -f notes.log
# 显示文件 notes.log 的内容,从第 20 行至文件末尾:
tail -n +20 notes.log
less
less aa.log
-N 显示每行的行号 + 回车
# 可以使用ctrl组合,也可以直接使用U D B F
ctrl + U - 向后移动半屏
ctrl + D - 向前移动半屏
ctrl + B - 向后移动一屏
ctrl + F - 向前移动一屏
Z 向下移动一屏
G - 移动到最后一行
g - 移动到第一行
less aa.log后输入
/xxx:向下搜索“xxx”的功能
?xxx:向上搜索“xxx”的功能
# 搜索多个条件
/xxx|xxx
# 进入less后跳转到哪行
:行号g
n 向前显示搜索结果
Shift+n 向后复看搜索结果
# 指定显示到哪行
less -N +555 aa.log
# 查找aa.log中xxx内容 -n 显示行号 -i忽略大小写
grep -in xxx aa.log
less 在屏幕底部显示一个冒号(:),等待用户输入命令
退出less
ctrl+Z
read
脚本执行赋值的时候,等号左右不要有空格
read -t 5 -p "输入对应的标号:" num
-s:隐藏输入的内容
-t:给出等待的时间,超时会退出read 秒
-p:给出提示符。默认不支持"\n"换行
num 用于接收输入的内容
输出输入的内容$num ${num}
read -t 5 -p '请输入:' num
echo $num
echo '\n'
echo ${num}
awk
对数据进行列的提取,是⽂本处理⼯具,默认按照空格切分
sort命令⽤于将⽂本⽂件内容加以排序,-n 按照数值排,-
r 按照倒序来排
案例的sort -n 是按照第⼀列的数值⼤⼩进⾏排序,从
⼩到⼤,倒序就是 sort -rn
uniq 去除重复出现的⾏列, -c 在每列旁边显示该⾏重复
出现的次数。
语法: awk '条件1 {执行动作} 条件2 {执行动作} ...' 文件名
# printf输出内容后不换行,print是换行
# awk 默认按照空格切分 $1输出第1列
awk '{printf $1}' aa.sh
awk '{print $1}' aa.sh
$1 #代表第一列
$2 #代表第二列
$0 #代表一整行
-F #指定分割符
# df 用于查询磁盘使用率
df -h | grep /dev/vda1 | awk '{printf "/dev/vda1的使用率是:"} {print $5}'
echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f\n", $0}'
# BEGIN 在读取所有行内容前就开始执行,常常被用于修改内置变量的值
# FS 在BEGIN时用于定义分割符
cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}'
# END 结束的时候执行
# NR 行号
df -h | awk 'NR==2 {print $5}' awk '(NR>=20 && NR<=30) {print $1}' /etc/passwd
grep
grep 对数据进行 行 的提取
语法:grep [选项]...[内容]...[file]
[选项] 可以不写,默认是查找匹配内容
-v #对内容进行取反提取 除了查找内容的以外内容
# -n 显示行号 123为要搜索的内容 aa.sh是从文件搜索
grep -n '123' 'aa.sh'
# 也可以 |为管道符 cat出的内容输送给grep
cat 'aa.sh' | grep -n '123'
cut
cut 对列数据提取
语法:cut [选项]...[file]
-d #指定分割符
-f #指定截取区域
-c #以字符为单位进行分割
# 查找aa.sh文件中有bin字符的行输出。cut对列提取
# -d对输出的行以':'分隔,然后取出-f 1 第一列
grep 'bin' 'aa.sh' | cut -d':' -f1
cat
用于连接文件并打印到标准输出设备上
# cat和echo使用 > 和 >>区别
>: 是覆盖原有文件内容
>>: 追加到原有文件末尾 会换行追加
# textfile1 的文档内容--加上行号后--输入 textfile2 这个文档里
cat -n textfile1 > textfile2
# textfile1 和 textfile2 的文档内容--加上行号(空白行不加)之后--将内容附加到 textfile3 文档里
cat -b textfile1 textfile2 >> textfile3
# 清空 /etc/test.txt 文档内容
cat /dev/null > /etc/test.txt
sed
sed的应用场景:主要对数据进行处理(选取,新增,替换,删除,搜索)
-n #把匹配到的行输出打印到屏幕
p #以行为单位进行查询,通常与-n一起使用
df -h | sed -n '2p'
d #删除
sed '2d' df.txt
a #在行的下面插入新的内容
sed '2a 1234567890' df.txt
i #在行的上面插入新的内容
sed '2i 1234567890' df.txt
c #替换
sed '2c 1234567890' df.txt
s/要被取代的内容/ 新的字符串/g #指定内容进行替换 sed 's/0%/100%/g' df.txt
搜索:在文件中搜索内容
cat -n df.txt | sed -n '/100%/p'
-e #表示可以执行多条动作
cat -n df.txt | sed -n -e 's/100%/100%---- -100%/g' -e '/100%-----100%/p'
# -n是显示行 搜索k的行显示
sed -n '/k/p' aa.sh
# 打印8到24行
sed -n '8,24p' aa.sh
sed -n '8,24p' aa.sh | grep 'k'
shell语法
-e 目标是否存在(exist)
-d 是否为路径(directory)
-f 是否为文件(file)
# 判断当前目录下是否有foer.sh这个文件,假如没有就创建出foer.sh 文件
[ -e foer.sh ] || touch foer.sh 文件
-r 是否有读取权限(read)
-w 是否有写入权限(write)
-x 是否有执行权限(excute)
[ -x 123.txt ] && echo '有执行权限'
-eq 等于(equal)
-ne 不等于(not equal)
-gt 大于(greater than)
-lt 小于(lesser than)
-ge 大于或者等于(greater or equal)
-le 小于或者等于(lesser or equal)
# if判断,[]内部判断要有空格
if [ $num == 5 ];then
echo 'xx'
elif [ $num == 6 ];then
echo 'xx'
fi
-o 是或者的意思
-a 是而且的意思
-not 是相反的意思
if [ $num == 6 -o $num == 8 ];then
echo 'xx'
fi
while [ 条件判断式 ]
do
执行动作
done
# for循环
for i in 1 2 3 4 5
do
echo "$i"
sleep 1
done
# `cat xxx` ``这里可以放置其他shell命令
# 默认以空格切分 循环输出内容
for i in `cat /home/ljw/jb.sh`
do
# 双引号里可以有变量,单引号不行
echo "$i"
sleep 1
done
# 查找系统/目录下的文件
find / -ctime +10 -a -type f -name "*.log"
-ctime +10:十天以前的
-type f:是文件类型
-name:指定名字
脚本样例
# $? 判断上个命令执行状态返回0=ok 1=fail
# $aa 或者 ${aa} 都是获取变量aa的值
例如:{}处理连接符的问题,aa=22 则${aa}book 输出是22book 如果使用$aabook 则会把aabook当做变量
# cat 用于查看小文件的命令
[root@MiWiFi-R2D-srv ljw]# ./gg.sh 44 66 kkk ss
第0个参数:./gg.sh
第1个参数:44
第2个参数:66
输入的所有参数是什么:4
总共输入了多少个参数:44 66 kkk ss
注意:
$0 获取当前执行文件的文件名
$1 获取输入的第一个元素44
$2 获取输入的第一个元素66
$# 获取一共输入的参数
$* 等到输入参数的个数
# gg.sh文件
echo "第0个参数:$0"
echo "第1个参数:$1"
echo "第2个参数:$2"
echo "输入的所有参数是什么:$#"
echo "总共输入了多少个参数:$*"
常见的几个符号
# 追加内容echo用于少量输入,,cat用于多内容输入
# >会覆盖原有的内容
cat >gg.txt
回车然后输入内容 control z可以退出
# >>不会覆盖原有的内容
例如:echo aa >> bb.txt
把aa追加到bb.txt文件的末尾
# ; 用于执行多条命令
cat bb.txt ; ls
当前目录下先执行cat命令,然后再执行ls命令
# | 管道符
cat bb.txt | grep bb
符号|就是从cat命令输出的内容里面,继续执行grep的结果 grep查询内容
# && 前面的命令执行成功,后面的才可以执行
cat ssdd.txt && ls
# || 前面的命令执行失败,后面的才可以执行
num = 6
# 双引号里面会输出变量值
"" 会输出变量值 "$num" = 6
# 单引号会直接字符串输出
'' 输出本身 '$num' = $num
# `` 反撇号输出命令结果
a=`date`
# $a就是日期
echo $a
# 输入的内容赋给 pass
echo "输入你的账号:"
read pass
echo "这是我的输入;$pass"
# 字符上色
# ``反撇号用于里面内容是命令,需要正常执行
read -p "`echo -e "\033[31m 请输入账号: \033[0m"`"
echo -e "\033[31m 红色字 \033[0m"
查看访问最频繁的前100个IP
# 内容都是以空格分隔,'{print $1}' 输出列的第一列$1
awk '{print $1}' access_temp.log | sort -n | uniq -c | sort -rn | head -n 5
统计访问最多的url 前20名
cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
统计耗时接⼝, 列出传输时间超过 2 秒的接⼝,显示前5条
cat time_temp.log | awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
备注:$NF 表示最后⼀列, awk '{print $NF}'
脚本执行赋值的时候,等号左右不要有空格
sh文件执行方法:
方法1: ./shell.sh
方法2: sh shell.sh 或者bash shell.sh
方法3: source shell.sh
# 没有权限时
添加执行权限 chmod +x shell.sh
不同于其它语言需要先声明变量
shell的变量直接使用,
eg: a=15
调用变量的话 $a 或者 a 或者 ${a}
$? #判断上一条命令执行的是否成功
$0 #返回脚本的文件名称
$1-$9 #返回对应的参数值
$* #返回所有的参数值是什么
$# #返回参数的个数和
>会覆盖原有的内容
>>不会覆盖原有的内容(追加)
; #执行多条命令
| #管道符
&& #前面的命令执行成功,后面的才可以执行
|| #前面的命令执行失败,后面的才可以执行
"" #会输出变量值
'' #输出本身
`` #输出命令结果
eg:a=`date`; echo $a
# and
if [ c1 -a c2 ]; then
…
fi
# and
if [ c1 ] && [ c2 ]; then
…
fi
# or
if [ c1 -o c2 ]; then
…
fi
# or
if [ c1 ] || [ c2 ]; then
…
fi
语法:[ 判断表达式 ]
文件(夹)或者路径:
-e 目标是否存在(exist)
-d 是否为路径(directory)
-f 是否为文件(file)
#判断当前目录下是否有foer.sh这个文件,假如没有就创建出foer.sh
[ -e foer.sh ] || touch foer.sh
权限:
-r 是否有读取权限(read)
-w 是否有写入权限(write)
-x 是否有执行权限(excute)
[ -x 123.txt ] && echo '有执行权限'
整数值(int型):
-eq 等于(equal)
-ne 不等于(not equal)
-gt 大于(greater than)
-lt 小于(lesser than)
-ge 大于或者等于(greater or equal) -le 小于或者等于(lesser or equal)
[ 9 -gt 8 ] && echo '大于'
小数(浮点型):
[ `echo '1.2 < 1.3' | bc` -eq 1 ] && echo '小于'
字符串:
= 相等
!= 不相等
[ 'kkkkk' != 'kkkk' ] && echo '不等于'
&&: 前面内容ok,后面才会执行
||: 前面内容no ok,后面才会执行
bc计算器
保留多少位小数可以通过scale 但是scale只对除法,取余数,乘幂 有效,对加减没有效
#计算出0.2+0.3的和并保留俩位小数,此时bc计算器会省略掉个位数的0
echo "scale=2;(0.2+0.3)/1" | bc
#计算出1.2+1.3的和并保留俩位小数
echo "scale=2;(1.2+1.3)/1" | bc
name=kk
echo ${#name}
lsof -i:9900
$?
如果lsof查出来有内容,$?:0 否则是1