shell常用命令

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 生成连续的自然数 seq 1 20 #输出是1,2……20,分隔符是换行符seq -s "," 1 20 #输出是...
    wo_monic阅读 537评论 0 7
  • 内建命令 所谓内建命令,就是bash自身提供的命令,不是外部可执行程序文件,可以用type来确定一个命令是否内建命...
    张国立_0695阅读 341评论 0 0
  • linux是大数据开发入门必备掌握知识,今天给大家介绍下linuxcentos7一些常用的命令 点击链接,从零开...
    呆子_23c9阅读 298评论 0 0
  • 八重樱:怎么从一名码农成为架构师的必看知识点:目录大全(不定期更新) 下面为大家总结Linux shell的常用命...
    八重樱勿忘阅读 277评论 0 1
  • 最近无聊,整理了一些Unix Shell常用命令,借鉴了一些其他文章内容。内容如下 结束语 到这里就结束了,如若不...
    SwordDevil阅读 584评论 0 0