文件相关
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 查看当前目录内容:ls、ll 清除终端内容:clear 进入下一级目录:cd 创建文件:touch 1.txt 创建文件夹:mkdir 11 复制文件或文件夹:cp 被复制的文件 复制的路径 查看当前路径:pwd 看当前用户所有历史指令(~/.bash_history,注:系统退出后才会保存):history 从历史指令中找最后一条以xx开头的指令并执行:!xx 强制删除指定文件或文件夹:rm -rf 文件名 查看文件内容并显示行号:cat -n 文件名 或 nl 文件名 统计文件行数:wc -l 文件名 查看文件前10行内容:head -10 文件名 查看文件后10行并实时展示最增内容:tail -10 -f 文件名 分页查看文件内容:more 文件名(下一页:空格、上一页:b) 分页查询并且搜索文件内容:less 文件名 (进入后按q退出,/加搜索内容并且高亮显示) 比较两个文档不同:diff 文件1 文件2 为路径创建短连接:ls -s 路径 短连接名(可以通过 cd 短连接名 直接进入对应路径) 按100行分割一次,a表示分割后的文件名前缀,后缀是自动生成的:split -100 文件名 aaa 文件按固定大小分割:split -b 1M 文件名 文本合并,可以借助cat:cat a* > a.txt用户相关
1 2 3 4 5 6 增加用户:useradd 用户名 设置密码:passwd 用户名 删除用户:userdel 用户名 查看当前系统用户:uname -a 给当前用户文件增加读写执行权限:chmod u+rwx 文件名 (u表示当前用户,还有g(group)、o(others);如果省略,则表示给u、g、o均添加权限) 给所有用户增加全部权限:chmod 777 文件名系统相关
1 2 3 4 5 6 7 8 9 10 11 12 查看cpu、内存实时状态:top 查看磁盘使用情况:df -h 查看内存使用情况:free -h 查看当前执行进程:ps -ef 查看网络系统的状态信息:netstat -a 强制终止指定某个进程:kill -9 pid 查看系统时间:date 查询命令位置:which java 查看ip、网卡等信息:ifconfig 系统日志的位置:/var/log/messages 向系统日志写消息:logger "xxxxx" 安装程序命令:yum、wget、rpm、apt-get...(有的适用于CentOS,有的RedHat,有的Ubuntu)指令
1 2 3 4 5 6 7 8 9 输出从2-10:seq 2 10 保存脚本执行结果并同时并查看:sh a.sh | tee b.txt 退出脚本:exit (正常退出返回0,异常退出返回非零) 为指令设置别名:alias 1='df -h'(重启终端还能使用别名需要将别名设置放到 ~/.bashrc文件中) 接触别名:unalias 1 定时执行某脚本:crontab 1 * * * * ~/1.sh (每小时1分的时候执行1.sh这个脚本) 查看当前用户定时器设置:crontab -l 删除当前用户定时器设置:crontab -r插入模式
1 2 3 4 5 6 7 8 9 10 11 G:跳到文档最后一行 gg:调到文档第一行 x:删除当前光标所在的字符 nx:从光标向后删除n个字符 dd:删除当前行 ndd:删除当前及后n行 D:删除当前行光标后边所有字符 r:replace,替换当前光标的字符 yy:粘贴 p:paste复制 u:撤销命令行模式
1 2 3 4 5 6 7 i:从当前行进入插入模式 o:从下一行进入插入模式 q:退出vim模式 q!:退出并不保存更改内容 wq:退出并保持更改内容 /**:查询字符串所在的位置,按下回车后用n进行搜索下一个,N返回上一个 nu:设置行号解释器
1 脚本开头:#!/bin/bash 或 #!/bin/sh(默认可以不写)执行脚本
1 2 ./shell.sh(需要执行权限) sh shell.sh 或 bash shell.sh(读取执行~只需要读取权限)变量
1 2 3 4 5 6 7 a=3:声明变量a,并赋值3 $a:等价于${a}。但是 ${a}ook 和 $aook就不一样 $?:上一个指令是否正确执行,上一个脚本是否正常退出(1-不正确,0-正确) $0:文件名 $1~$9:第几个参数值(echo ${1:-daily},取脚本第一个参数,如果没有,则赋值daily) $#:一共几个参数 $*:所有入参符号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |:管道符号:把前边的输出作为后边的输入 ls -s|sort -nr >:覆盖输出; echo "abc" > a.txt >>:拼接输出; echo "abc" >> a.txt ;:一行执行多条语句的分隔符 cat a.txt ; ls &&:前边语句成功才会执行后边语句 cat a.txt && ls ||:前边语句失败才会执行后边语句 lo || ls $$:输出当前脚本的执行进程id echo $$ "":输出变量值 a=10;echo "$a" -> 10 '':输出本身 a=10;echo '$a' -> $a ``:执行内部语法。 echo `date` 等价于 date &>filename:把标准输出和错误输出都重定向到文件filename sh abc.sh &> a.txtread输入
1 2 3 4 5 6 7 8 9 10 -t 阻塞时间 -s 隐藏输入的字符 -p 给出提示符 -n 读取字符的个数,个数到达临界之后会自动执行 把接下来输入的数据赋值给abc: read abc 在10秒内最多输入3个字符: read -t 10 -n 3 -p '请输入密码:' pass echo "密码是:$pass"计算器
1 2 3 4 5 6 7 8 9 整数: expr 10 + 20 #注意+号两边的空格 echo $[10 + 20] echo $((10 + 20)) echo $[10 % 3] 取余 echo $[10 \* 2] 乘法需要对*转义 bc计算器: echo "scale=2;(1.2+2.3)/1" | bc #把前边的输出作为后边的输入,scale只对乘除有效所以需要/1(2;表示保留两位小数)条件判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [ -e a.txt ] :方括号必须有左右空格。 [ ! -e a.txt ] :感叹号!表示取反 文件判断: -e exist 文件是否存在 -d directory 是不是目录 -f file 是不是文件 权限: -r 是否有读权限 -w 是否有写权限 -x 是否有执行权限 整数比较: -eq(equal) -ne (not equal) -gt (greater than) -lt (lesser than) -ge (greater or equal) -le (lesser or equal) 小数比较:借助bc计算器 bc判断true返回1,false返回0 [ `echo "1.2 > 1" | bc` -eq 1 ] && echo '大于' 字符串: 直接用 = 或 != 进行判断 [ "1" = "1" ] && echo "相等"if判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 格式1: if [ 条件 ];then echo "xxx" fi 格式2: if [ 条件1 ];then echo "xxx" elif [ 条件2 ];then echo "yyy" else echo "zzz" fi #拓展:[]和[[]]的其中一点区别(双括号要强大的多) if [ $a -ne 1] && [ $a != 2 ] 等价于: if [[ $a != 1 && $a != 2 ]] 等价于: if [ $a -ne 1 -a $a != 2 ] (其中-a是and,-o是or)for循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 示例1: for i in 1 2 3 4 5 do if [ $i -eq 2 ];then continue else echo "$i" sleep 1 fi done 示例2: for i in $(cat 1.txt) do ping -c 2 $i done 注:-c表示最多ping几次。windows上是-n 示例3:((条件)) for (( i=1;i<11;i++ )) do echo $i sleep 1 done 注:i++相当于i=i+1,只能在(())中使用,等价于:let 'i+=1'case选择
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 echo '请输入城市:' read city case $city in '上海') echo '上海:35度' ;; '北京') echo '北京:20度' ;; *) echo '未知城市' esac #注:case倒叙 示例2:case接受简单正则 case $1 in [a-z]|[A-Z]) echo "字母" ;; [0-9]) echo "数字" ;; esacwhile循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 示例1:输入数字,并求1到该数字的和 sum=0 i=0 while [ $i -lt $1 ] do sum=$(($sum+$i)) i=$[$i+1] done echo "从1加到$1的和是:$sum" 示例2:模拟菜单 while [ 1 ] do cat <<EOF #<<叫输入重定向,EOF是随便定义的(成对即可) 1.执行1.sh 2.执行2.sh q.退出 EOF #末尾的EOF必须顶行写,且前后均不能有空格或tab read -p '请选择:' key case $key in 1) clear echo '执行1.sh' ;; 2) clear echo '执行2.sh' ;; q) clear echo '退出' break ;; esac done 示例3: num=0 while [ $# -gt 0 ] do num=$(($1+num)) echo "剩余参数:$*" shift #将参数向左偏移一个 done echo "总和:$num" 结果如下: [root@localhost xuan]# sh 5.sh 1 2 3 4 5 剩余参数:1 2 3 4 5 剩余参数:2 3 4 5 剩余参数:3 4 5 剩余参数:4 5 剩余参数:5 总和:15 示例4:死循环 while true # 或 while : 或 while [ 1 ] do let i++ echo $i sleep 1 done函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 示例1:两数求和 function add(){ echo $(($1+$2)) } add 10 20 示例2:遍历指定目录下所有目录 function listFiles() { for file in `ls $1` do dir=$1"/"$file if [ -d $dir ];then ls $dir listFiles $dir fi done } listFiles $1字体颜色和特效
1 2 3 4 5 6 7 echo -e "\033[背景颜色;字体颜色;特效 \033[0m" 示例1: echo -e "\033[32;41;5m 文本字体 \033[0m" #注:最后的0m表示关闭属性,"\033["是固定前缀和后缀 示例2: read -t 10 -p "`echo -e "\033[32;41;5m 请输入密码 \033[0m"`" pass去重/排序
1 2 3 4 5 6 7 8 相邻行去重: cat a.txt | uniq 相邻行去重并统计次数: cat a.txt | uniq -c 所有行排序,然后相邻行去重并统计次数: cat a.txt | sort | uniq -c -t:表示以:为分隔符(默认空格),-k3表示以第3列排序(默认整行),-r表示反转: cat a.txt | sort -t: -k3 -r文件搜索
1 2 3 4 5 6 7 8 9 10 11 12 简单正则+通配符: find . -name "a[0-9]*" 有的大写,有的小写: find / -size 10c/10k/10M/10G d表示目录,f表示文件,l表示链接: find . -type d/f/l -mtime表示修改时间;-3表示3天以内,+3表示3天前: find . -mtime -3/+3 指定用户: find . -user root xargs是将管道前的搜索作为参数传给后边,此处如果不加xargs,则后边的指令是没有意义的: find . -name "[a-b]*.sh" | xargs rm -rf文本·行搜索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -v invert 反向选择 -i ignore 忽略大小写 -w word 单词匹配 -n 显示行号 "^xx" 某行以xx开头(行首匹配) grep "^user" a.txt 或:grep -E "^user" a.txt "xx$" 某行以xx结尾 grep "user$" a.txt -E regex 正则 grep -E "sbi*" /etc/passwd grep -Ein "(linux){2}" a.txt #注:()表示单元 grep -Ein "(linux)+" a.txt grep -Ein "[0-9]+" a.txt grep -E "\*" a.txt #注:\转义等价于:grep "*" a.txt (默认不支持正则) grep -E "[0-9]+\.+[0-9]+\.[0-9]+\.[0-9]+" a.txt #注:搜索ip grep -E "^$" a.txt #注:找空行 grep -E "^[^d]" a.txt #注:找不是d开头的行。^放在[]外边表示"以xx开头",放在[]中表示"除了"文本·列操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -d 指定分隔符,delimiter -f 指定第几列 -c 按字符截取 示例1:以冒号分割后,取第1列和第3列 cut -d ':' -f 1,3 /etc/passwd #注:1,3表示第1列和第3列;1-3表示第1列到第3列;3-表示第3列以后。 示例2: cut -c 1-4 /etc/passwd #截取第1列到第4列字符,以字符为单位 示例3:查找linux系统中所有不能登录的用户名 cat /etc/passwd | grep /sbin/nologin | cut -d ':' -f 1 #注1: cat /etc/passwd | cut -d ':' -f 1 等价于cut -d ':' -f 1 /etc/passwd #注2:/bin/bash结尾的用户是可以登录的;/sbin/nologin结尾的是系统默认用户,不可以登录 #注3:cut用空格分割的话,每一个空格都会计数1次。 Mem: 1837 107 298 0 1431 1532 free -m | grep -i mem | cut -d " " -f 12 -> 1837 free -m | grep -i mem | cut -d " " -f 2 -> 空格文本操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 awk是一门语言,是3个创始人的姓名首字母缩写而成 printf不换行打印;print 换行打印 printf '%3s %3s\n' 11 12 -> %ns是字符串,n默认是1可省略 printf '%2i %2i\n' 11 12 -> %ni是数字 printf '%.2f\n' 0.1234 -> 0.12 "%.nf"是格式化浮点数 3.1 awk (默认分隔符是空格) 3.2 awk '条件1 {动作1} 条件2 {动作2}' 文件名 echo "0.123+0.123" | bc | awk '{printf "%.2f\n", $0}' #注:$0表示整行,$1表示第一列... df -h | grep /dev/sda2 | awk '{print "sda2的磁盘使用率:" $3}' free -m | sed -n '2p' | awk '{print "total:"$2"\n" "userd:"$3"\n"}' 3.3 awk 选项 '条件1 {动作1} 条件2 {动作2}' 文件名 cat /etc/passwd | awk -F ":" '{printf $1}' #注:-F指定分隔符,field-separator cat /etc/passwd | awk 'BEGIN {FS=":"}{print $1} END {print "结束了"}' #注1:FS是field separator #注2:BEGIN是在awk之前执行,一般用于修改内置变量;END是awk执行完之后执行 3.4 NR 行号,是awk中的一个常量(num row);NF列号(num field) df -h | awk 'NR==2 {print $1}' df -h | awk '(NR>=2 && NR <=4) {printf $1"\n"}' cat a.txt | awk 'END{print NR}' #统计有多少行 cat a.txt | awk '{if(NR==1){print $0}}' #打印第一行 cat a.txt | awk '$0~/java/' #$0表示整行,~表示匹配,/被匹配文本/ cat a.txt | awk '$0!~/java/' # !~表示不匹配文本·行操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -n和p一块使用: df -h | sed -n '2'p #查询第2行,p表示print,也可以写成sed -n '2p' d:删除 df -f | sed '2'd #删除第2行 eg: cat a.txt | sed -n '1,/java/'p #搜索第1行到包含java的那一行。 cat a.txt | sed -n '10,$'p #搜索第10行到最后一行。等价于:sed -n '10,$'p a.txt cat a.txt | sed '2,3'd #搜索除了第2行到第3行的数据 a:在下边插入 df -h | sed '2a xuan' i:在上边插入 df -h | sed '2i xuan' c:替换 df -h | sed '2c xuan' #把第2行替换成xuan s/旧串/新串/g df -h | sed 's/oldStr/newStr/g' -i:对源文件进行修改(危险) sed -i 's/oldStr/newStr/g' a.txt sed -i '2i 玄' 5.txt -e:指定多个条件简单例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 1.判断两个数是否相等 if [ $1 -eq $2 ];then 注:if后有空格 echo "$1等于$2" else echo "$1不等于$2" fi 等价于: [ $1 -eq $2 ] && echo "$1等于$2" [ $1 -eq $2 ] && echo "$1不等于$2" #注:多条件 if [ "a" = "a" ] && [ "b" = "b" ] 2.判断上一个指令是否执行成功 fName=22.txt touch $fName if [ $? -eq 0 ];then echo "$fName创建成功" fi 3.判断输入的数字是否大于10 echo '请输入一个数字:' read number if [ $number -eq 10 ];then echo '等于10' elif [ $number -lt 10 ];then echo '小于10' else echo '大于10' fi 4.越过交互:给用户xuan设置密码。需要交互两次 方式1: passwd xuan < password.txt #注:password.txt文件中有两行相同的密码 方式2: passwd xuan <<EOF #注:<<前是指令。heredoc语法 123 123 EOF #注:末尾的EOF必须顶行写,不能有空格或tab sh a.sh <<EOF 土豆 root EOF 方式3: echo 123 | passwd --stdin xuan #注:passwd的--stdin参数ubuntu不支持,centos才可以巡检内存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 total=`free -m | sed -n '2p' | awk '{printf $2}'` #注:awk '{}'别漏了单引号;printf别漏了f used=`free -m | grep -i mem | awk '{printf $3}'` percent_used=`echo "scale=2;$used/$total" | bc | awk '{printf "%.2f",$1}'` echo -e "总共:${total}m" echo "已用:${used}m" echo "内存使用率:$percent_used" threshold=0.04 flag=`echo "$percent_used > $threshold" | bc` if [ $flag -eq 1 ];then echo -e "\033[31m内存使用率超过$threshold \033[0m" #注:31m后边如果有空格,则打印出来也有 fi批量创建用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 read -p '请输入用户名前缀:' user read -p '请输入创建用户个数:' num echo "$user $num" for i in `seq 1 $num` #注:seq默认从1开始,所以1可以省略 do #创建用户:先判断用户是否存在 newUser=$user$i cat /etc/passwd | awk -F":" '{printf $1"\n"}' | grep $newUser if [ $? -eq 1 ];then #注:上边搜不到则$?=1 useradd $newUser echo "创建用户$user$i" #设置8位随机密码. /dev/urandom文件中会随机产生一些乱码数据,使用md5sum可以得到随机字符串 password=`head -1 /dev/urandom | md5sum | cut -c 1-8` echo "用户名:$newUser\t密码:$password" >> user_passwd.txt fi done从mysql查询数据
1 2 3 4 5 read -p '请输入你要查询的商品名称:' name read -p '请输入数据库用户名:' username /usr/bin/mysql -u${username} -p -e "use test;select * from item where name = '$name';" #注:-e表示excute,不进入mysql命令窗口,直接执行语句高效登录远程服务器
1 2 3 4 5 ip=`cat ip.txt | grep $1 | awk '{printf $2}'` ssh $ip 执行: sh aaa.sh beijing #注:beijing赋值给$1,ip.txt文件中地址和ip使用空格隔开最后推荐大家一个常用搜索Linux命名的网站:https://man.linuxde.net/,可以查看Linux命令的选项参数