shell

306 阅读6分钟

Linux命令

$  #引用变量#多个命令写在一行#家目录
&1 #前面的那个参数
&& #连接两个命令 前面的命令成功,后面的命令才会执行
|| #连接两个命令,前面的命令不成功,后面的命令才会执行
& #命令后面,表示后台运行
man ls

ls -alh
ls -alt file

pwd

cd

mkdir 

history #查看历史命令,上限1000   
#!!    两个叹号相当于history
# !5 历史命令中的编号为5的命令
# !$ 上一条命令的参数
# !vi history中的最近一条vi命令


cp

?一个 *任意个 []里面任选 #通配符

which #显示某个命令的完整路径

whereis #显示某个命令的完整路径

touch

rm

vi

cat #显示文件内容
cat -n #显示行号

tac #倒叙显示文件内容,用于对日志文件的检查

重定向>   反向重定向<   追加>>
2> 错误重定向

Ctrl+Z #暂停一个任务
jobs #查看后台运行的任务
fg #恢复暂停的任务

Ctrl + C #杀死进程

more
•空格翻页 
•回车下一行 
•b上一行 
•/查找

head [option] file
•head file #默认显示10行
•head -1 file #显示一行
•head -2 file #显示前两行
•head -n 20 file #默认10行,-n指定行数


tail [option] file
•tail file #默认显示最后10行
•tail -1 file #显示最后一行
•tail -2 file #显示最后两行
•tail -f file #实时显示文件尾部

find /path/to -name “test*” #按照命名规则查找
•find /path/to -type f #按照文件类型查找
•find /path/to -ctime -1 #查找一天以内的文件和目录
•find /path -type d #目录
•find /path/to -cmin +1440 #查找1440分钟以前的文件和目录
#另外,可以在查找后使用 -exec 执行后续操作
•find /path/to -ctime +30 -exec rm -rf {} \; #删除30天前的文件。
•find /path -ctime +9 -type f -exec ls -l {} \;//可以在查找后使用-exec执行后续操作

•tar -zcvf file.tar.gz files
•tar -zxvf file.tar.gz

gzip file
•zcat file.gz
•gunzip file.gz
•多用于日志的压缩

useradd username

passwd [username]
•passwd #为当前用户修改密码
•passwd username #为其他用户修改密码(通常是root操作)

su - #切换到root,使用root环境变量

whoami #查看当前使用的用户名称

logname #查看登录时的用户

who #查看当前所有登录用户

last #查看用户登录历史

chown [option] username:groupname file #改变文件的属组

chmod #修改文件的读写属性
•chmod 755 file
•chmod -R 644 dir #目录下所有文件

df #显示分区磁盘空间使用情况
•df [option] [file]
•df -h #方便阅读的方式显示
•df -m #区块为1048576字节
•df -k #区块为1024字节

du #计算目录占用的磁盘空间
•du [option] [file]
•du
•du -sh
•du -sk *
•du *|sort -nr

free #查看内存使用情况
•free [option]
•free
•free -k
•free -m

top #显示linux的任务情况,很占内存,默认按照CPU排序

ps #显示当前运行进程
•ps -ef |grep Nginx

kill pid #进程的父进程和子进程全部杀掉
+ kill -9 #只杀进程本身

ifconfig #配置网卡

netstat #查看网络信息
•netstat -lnp #监听端口情况
•netstat -anp #所有端口情况

uname -a #打印系统信息

date #查看修改系统时间
•date -s 19:00:00
•date 
•date +%Y  2019
•date +%y  19
•date +%M  
•date +%s  时间戳
•date -d @100  #如何根据时间戳求时间
•date +%Y-%m-%d

reboot #重启命令

shutdown #关机命令
•shutdown -k now #通知所有终端,现在要关机,但是实际上不关机
•shutdown -h now #通知所有终端,现在要关机,实际上确实关了
•shutdown -k 5 #通知所有终端,5分钟后要关机,但是实际上不关机
•shutdown -h 5 #通知所有终端,5分钟后要关机,实际上确实要关机了

gzip zcat
•gzip file
•zcat file.gz
•gunzip file.gz

shell变量

#变量不能加空格
#变量名不能以数字开头
export a=1  #全局声明一下,这样在子shell中也可以使用
bash  #进入子shell
echo $a 
1
exit  #退出子shell
b=2 #b没有进行全局声明
bash
echo $b
    #结果为空
exit
echo $b
2
unset a  #取消全局声明
bash
echo $a
    #结果为空

#单引号原样输出
echo '$a'     $a

#双引号,可以解析变量、命令
echo "$a123"    1123

#反引号``=$()
var=`whoami`
echo $var           #输出当前用户

字符串叠加
b=$a"123"
c=$a$b

cut #分割
cut -d ':' -f 1,3 /etc/passwd  #-d表示以:分隔,取第一个和第三个字段
cut -c 2-4 /etc/passwd  #选取第2到第4个字符串

sort -n file #以数字方式排序
•cat sort.txt|sort
•sort sort.txt #已第一个字符为准1111,2
•sort -n sort.txt  #已空格之前的所有数作为一个整体排序
•sort -r sort.txt  #倒序
•sort -u sort.txt  #去重uniq

uniq #去重 
uniq -c #把重复的行数显示出来

#wc #查看文件行数、单词个数、字节数
wc -l file #查看行数line
cat install.log |wc -l #只输出数字行数
cat /etc/passwd|wc -l #查看本地用户数

line=`wc -l 4.txt|cut -d ' ' -f1`;echo $line
if [ $line -lt 3 ];then echo "no";fi

tee 重定向并输出到屏幕

tr#替换

split -l 10000 1.txt #将1.txt按照行切割成每个包含1000行的多个文件

wc -l *

split -b 1M 1.txt #按照大小为1M
du -sh *

shell正则

基础的正则表达式

一个字符集

  • 点.除换行符之外的任意字符
  • * 零个或多个
  • 脱字符^ 一行的开头
  • 美元 $ 行尾
  • []在正则表达式中匹配括号中的一个字符
  • \ 转义,使一个特殊的字符表示原来字面上的意思
  • <...>表示单词的边界
cat text.txt |egrep -o "abc" #-o只显示匹配的,不是默认的一行

grep

grep '正则表达式' file #在file文件中查询正则内容
grep 'mysql' 1.txt #mysql出现的行都列出来
grep -c 'mysql' 1.txt #只显示数字,即出现的行数
grep -n 'mysql' 1.txt #显示行号
grep -n --color 'mysql' 1.txt #颜色标记
grep -o 'mysql' 1.txt #统计个数,即显示mysql几个
grep -o 'mysql' 1.txt|wc -l 
grep -v 'mysql' 1.txt #取反,不包括mysql的
grep -A (after) B(before) C(center)

grep -r '' /etc  #遍历显示某一目录下

别名alias grep='grep --color'

grep 'ro.t' 1.txt  #.任意字符
grep 'ro*t' 1.txt  #* 0个或多个前面的字符
egrep是grep的扩展 +和?要加-E,也可以全部用egrep
grep -E 'ro?t' 1.txt  #? 0/1
egrep 'ro?t' 1.txt
grep -E 'ro+t' 1.txt  #+ 1/n个
egrep 'ro+t' 1.txt

egrep 'root|mysql' 1.txt #|或者
grep 'root\|mysql' 1.txt #grep要使用转义字符
egrep '(rr){1,3}'1.txt  #大于1对rr,小于3对rr

Sed

作为unix工具,文本处理工具,非交互式的编辑器,内置在Linux里的命令-------查找删除 替换最擅长

#按照行号打印 sed -n '1,3p'file  #-n只打印目标行
#打印第一行
sed -n '1p' txt.txt
#打印第二行到第四行
sed -n '2,4p' txt.txt



#-e 流水线,一行匹配两次root和mysql,都包含则打印两次
sed -e '/root/p' -e '/mysql/p' -n 1.txt
sed '/root/p;/mysql/p' -n 1.txt  #一行直接匹配两次


#模式匹配符//
#打印文件中含有字母c的行
sed '/c/p' txt.txt
#打印文件中以c开头的行
sed -n '/^c/p' txt.txt
#打印文件中,含有三个以上连续相同字母的行
sed -n'/\([a-zA-Z]\) {2,}/' txt.txt
#打印匹配三个连续a和三个连续c之间的行
sed '/aaa/,/ccc/p'

#删除第三行
cat txt.txt |sed -n '3d'
#删除第三到第五行
cat txt.txt |sed -n '3,5d'

#删除匹配行
#删除以this单词开头的行
cat txt.txt |sed '/^this/d'
#删除连续的a和连续的d的行以及两者之间的行
cat txt.txt |sed '/aa*/,/dd*/d'


#sed替换
sed 's/dd/cc/' txt.txt >>txt1.txt #s替换默认替换每一行首次出现的  
#全局替换g
sed 's/dd/cc/g' txt.txt
cat txt.txt |sed 's/dd/cc/g'
#指定行的替换
sed txt.txt '1,3s/dd/cc/' txt.txt
#匹配行的替换
#先匹配//,再替换。以xx开头,将dd替换为cc
cat txt.txt |sed '/^xx/s/dd/cc/'
sed '/^bb/,/^cc/s/dd/cc/' #将bb开头和cc开头的行,替换
#删除一串a
cat txt.txt|sed 's/aa*//'

#sed 与egrep相比,要加-r,否则使用'\'反斜杠转义
#用到了内存空间()会记录次数,\1就是第一次

ls|sed -r 's/(.*).txt/\1.jpg/'#将txt格式的转换成jpg格式
#批量改名
ls|sed -r 's/(.*).txt/ mv \1.txt\1.jpg/'|sh

#将第一个和最后一个调换位置。

Awk作为Unix工具

处理结构化的文本,强大的编程语言

逐行遍历,以分隔符为界限,抓取自己想要的内容域

#固定用法
cat txt.txt |awk 'BEGIN{}END{}'
cat txt.txt |awk '{print $1}'#$1第一个域,空格分开, $NF最后一个域,$(NF-1)倒数第二个域

#分隔符
awk -F ':'   以:为分隔符,前后两个域
awk -F '[^0-9.]+' '{print $1}' 抓取ip

#匹配
cat txt.log |awk '/bb/ {print $0}'
cat txt.log |awk '$2~/bb/ {print $0}' #第二个匹配root的,输出全部
awk -F ':' '$1=="root" ||NR>30 {print $1,$2}' #NR行

#判断
cat txt.log |awk '{if($1=="bill")print}'

#批量改名
ls |awk -f "." '{print "mv" $1 "." $2  " " $1".jpg"}'|sh

shell script

#告诉系统其后路径所指定的程序及时解释此脚本文件的shell程序
#! /bin/bash  

#调试脚本 
#!/bin/bash -xv
  • sh
#-x 用于远程调试,可以一行脚本出一行执行结果
sh -x test.sh >>tmp.txt 2>&1 
#把标准错误2重定向到标准输出1,输出到文件tmp.txt
  • ssh 远程连接
ssh root@192.111.111.111
ssh 192.111.111.111 -l zhang
  • scp 远程文件拷贝命令
scp /root/txt.txt root@192.1.1.1:/tmp   #上传
scp root@192.1.1.1:/tmp/ip.txt /root    #下载

scp -a   #远程备份
scp -p
  • crontab 自动定时执行文件
#防止断电等意外导致文件丢失
crontab -l >>/tmp/contab.txt   

crontab -e   #相当于vi
#分钟 小时 天 月 星期 执行的脚本

  • echo
#-e参数可以显示转义字符
echo -e "a\nb"   

#输出a的值
a=1
echo $a

#远程连接ip列表,执行date命令
for i in "ip.txt";do ssh $i date;done 

#echo参数
echo "$pwd aa      bb"   #一个参数,识别命令,多空格
echo $pwd aa      bb    #三个参数,中间只有一个空格隔开

shell脚本

  • 大量重复一致性操作代替人工操作
  • 需要自动执行
  • 简单命令行无法完成
#!/bin/bash 解释器 固定用法
#引入profile,绝对路径相对路径,环境变量等
source /etc/profile   

注意

命名原则:不能全大写
变量赋值a=1,等号前后不能有空格
echo $? 表示上一个的运行结果,0表示成功,非零表示失败。(2表示不存在)
$#  参数个数
$@$IFS 为分隔符列出所有传递到脚本中的参数
$*  以一个字符串形式输出所有传递到脚本的参数
$! 后台最近执行命令的PID
与、或没有优先级,从左到右的顺序

#某文件是否存在
-f file 

#某字符串是否为空,为空为真0,否则为假非零
-z ""

#如何获取变量stra的长度
echo ${#stra}
#如何打印变量sta的最后5个字符
echo ${sta:-5}
#数学运算
a=1
b=2
c=$[$a+$b]
c=$(($a+$b))

判断

#if判断
ls if.sh > /dev/null 2>&1
if [ $? -eq 0 ]  #空格一个也不能少
then
    echo "if.sh exists"
fi

#三目运算符
[ ] ? ||

#-e 是否存在

if [ -e if.sh ]:then
    echo "if.sh exists"
fi

#-f是否文件

整数比较

  • -eq
  • -ne
  • -le
  • -lt
  • -ge
  • -gt

字符串比较

  • ==
  • !=
  • >
  • <
  • -n
  • -z

for循环

for i in `seq 1 10`
do 
    flag=`ssh 192.168.1.$i "cat /etc/redhat-release"|awk '{print $1}'`
    [ "$flag" != "centos" ] && continue
    ssh -t 192.168.1.$i "sudo yum update ssh"
done

while循环

while [$i -le 10 ]
do
    echo $i
    i=$(($i+1))




#管道的写法
i=1
#管道相当于起了一个新的子进程
cat $Home/iplist.txt|while read line
do 
    echo "this is line $i:$line"
    i=$(($i+1))
done
echo $i #为1

#重定向的写法
i=1
while read line 
do 
    echo "this is line $i:$line"
    i=$(($i+1))
done<$Home/iplist.txt
echo $i #为4

#死循环while true
while true
do
    date
    sleep 2
done


#case
case $num in
1)
2)
*)
esac


#read交互
#!/bin/bash
echo "please type your choice:yes/no"
read flag
read -s flag #非明文
[ "$flag" == "yes" ]&&echo "your choice is yes"||echo "your choices is not yes"


#select交互
#!/bin/bash
ps3="you want to?"
select choice in "add" "delete" "modify"
do
    echo "your choice is $choice"
    break
done

shell编程

#!/bin/bash
#这是第一个shell脚本
read -p "请输入一个数字:" num
echo $num
if :
then
    echo "true"
fi
if [ "1" == "1" ] #elif
then
    echo "true"
else
    echo "false"
fi

if [ $a -lt 10 -a $a -gt 5 ];then echo ok;fi #-a and
if [ $a -gt 3 -o $a -lt 4 ];then echo ok;fi  #-o or
#!/bin/bash
read -p "input:" num
m=`echo $num|egrep '[^0-9]'|wc -l`
if [ $m -eq 1 ]
    echo "你输入的不是纯数字,请重新输入"
    exit 1
fi
n=$[num%2]
if [ $n -eq 0 ]
    echo "偶数"
else
    echo "奇数"
fi

[ -e 1.sh ] && echo "1.sh exits"   #&& 条件成立
[ -e 12.sh ] || echo "12.sh is not exits"   #||条件不存在