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" #||条件不存在