1.16条常用的命令
1.文件的权限修改:(把文件1.txt的归属改为mysql的,然后ll查看) chown mysql:mysql 1.txt 2.增加当前用户的x权限,然后ll查看: chomd u+x 1.txt 3.对比文件的差异: diff 1.txt 2.txt 4.查询文件位置: find ./ -name 1.txt 5.杀掉进程 kill -9 9865 6.杀掉test用户下面的所有进程: ps -ef | awk '$1=="test"{print $2}' | xargs kill -9 7.查看时间: date 8.查看当前用户 id 9.查看当前主机信息 uname -a 10.使用root用户修改test用户密码: passwd test 11.磁盘空间信息 df -h 12.查看当前所在目录 pwd 13.标准输出,和print类似: echo '123' 14.查看文件前10行信息 head -10 1.txt 15.查看文件后10行 tail -10 1.txt 16.vi基本使用 ESC后: x:删除一个字符 dd:删除一行 底行模式: 设置行号:set nu 查找:/字符
2.文件权限问题命令:
1.权限字符: 分三列:所有者,所属组,其他 r:读---4 w:写---2 x:执行---1 2.增加当前用户的x权限,然后ll查看: chmod u+x 1.txt 3.文件的权限修改:(把文件1.txt的归属改为mysql的,然后ll查看) chown mysql:mysql 1.txt 4.例如:-rw-r--r--. 1 root root 68 Mar 27 00:40 test.sh 所有者:root 权限:rw 所属组:root 权限:r 但是所有者root可以使用:sh test.sh来执行这个文件,因为可读 直接使用./test.sh执行不了, 需要授权:chmod +x test.sh 即可执行 5.执行文件:(推荐./和sh的方式) 有r: sh test.sh bash test.sh source test.sh 有x: sh test.sh bash test.sh source test.sh ./test.sh 6.sh的原理: 读取文件的命令,然后执行文件里面的命令,所以只要有r权限就能执行
3.命令操作符号问题:
1.符号> 删除文件内容追加新内容,经常和cat一起使用 cat >1.txt 回车然后输入内容 2.符号>> 不删除文件内容追加字符,经常和cat一起使用 cat >>1.txt 回车然后输入内容 3.符号; 执行多条命令 cat 1.txt ; ls 4.符号| 管道:| 表示管道,上一条命令的输出,作为下一条命令参数(输入)。 cat 1.txt | grep 你好 5.符号&& 前面的命令执行成功才执行下一条命令 cat 1.txt && ls 6.符号|| 前面的命令执行不成功才执行下一条命令 7.符号"" 输出变量值 echo "第一个变量是:$a" 8.符号'' 只会当成字符串输出 echo '第一个变量是:$a' 9.符号`` 符号内解析为一条命令 a='date' 为字符串 echo $a 结果为date a=`date` 为一条命令 echo $a 结果为时间 10.无底洞 2>/dev/null 把错误的输出丢到无底洞,不会在控制台打印错误信息 2>/dev/null 把正确的输出丢到无底洞,不会在控制台打印正确信息 cat 1.txt 2>/dev/null
4.运算符号问题:
1.输出表达式的三种方法: expr 12 + 2 echo $[12 + 2] echo $((12 + 2)) 2.使用bc计算器(字符串交给bc处理) echo "1.2+1.3" | bc 结果:2.5 echo "scale=2;1.2+1.3" | bc 结果:2.5 echo "scale=2;(1.2+1.3)/1" | bc 结果:2.50
5.判断运算的问题:
-e 目标是否存在: [ -e 1.txt ] || touch 1.txt -d 是否为路径 : [ -d /docker ] && echo '存在' -f 是否为文件 -r 是否有r权限: [ -r 1.txt ] && echo '有读权限' -w -x 整数: -eq 等于 [ 9 -eq 9 ] && echo '等于' -ne 不等于 -gt 大于 -lt 小于 -ge 大于或等于 -le 小于或等于 字符串: = 等于 [ 'ggg' = 'ggg' ] && echo '等于' != 不等于 小数:通过bc计算器 [ `echo '1.2 > 1.3' | bc` -eq 1 ] && echo '大于' 常用: [ $? -eq 0 ] 判断上一条命令是否执行成功
6.read命令:
read命令: -p 给出提示符 -s 隐藏输入内容 -t 给出等待时间,超时退出read -n 限制读取字符个数,超过临界值会自动执行
7.-e 的作用
-e :激活命令的作用: echo -e "\n" `echo -e "\033[4;31m 你好: \033[0m"`
8.处理海量数据;grep,awk,sed,cut
8.1grep:行操作
-v :内容的取反 -n :行号+内容 -w :精确匹配 -i :忽略大小写 ^ :匹配行首 -E :正则匹配 在123.sh文件提取包含user的行内容 grep 'user' 123.sh 匹配以user开头的行 grep '^user' 123.sh 匹配包含user1或user2或user3的行 grep -E 'user1|user2|user3' 123.sh
8.2cut:列操作
-d :指定分割符(不加默认tab键分割) -f :指定截取区域 -c :以字符为单位进行分割 以':'为分割符,截取出123.sh文件第一列和第3列 cut -d ':' -f 1,3 123.sh 以':'为分割符,截取出123.sh文件第一列到第3列 cut -d ':' -f 1-3 123.sh 以':'为分割符,截取出123.sh文件第二列到最后一列 cut -d ':' -f 2- 123.sh 截取123.sh文件第二个字符到第五个字符 cut -c 2-9 123.sh 案例: 领教教你截取所有可登陆系统的普通用户(除root) grep '/bin/bash' /etc/passwd | cut -d ':' -f 1 | grep -v 'root' cat /etc/passwd | grep 'bin/bash' | cut -d ':' -f1 | grep -v 'root'
上述命令也可以用cat命令:
cat 123.sh | cut -d ':' -f 1,3
8.3强大的awk:列操作
awk [选项] '条件{执行动作} 条件2{执行动作} ..' 文件名 选项和条件可以不写 printf:格式化输出,不会自动换行 \t:tab \n:换行 %ns:字符串 n表示字符串个数 %ni:整型 n表示数字个数 %.nf:浮点型 n表示小数点后个数 printf '%s\t%s\t%s\t\%s\n' 1 2 3 4 5 print:会自动换行 例子:查看磁盘的使用率 df -h | grep /dev/vdal | awk '{printf "/dev/vdal的使用率:"} {print $5}' 浮点计算(最后的$0表示一整行) echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f\n",$0}' $0:一整行 $1:第一列 $2:第二列 ... 条件: \F:指定分割符: cat /etc/passwd | cut -d ':' -f 1 cat /etc/passwd | awk -F":" '{print $1}' BEGIN:读取所有文件内容前执行,一般用于修改内置变量的值 FS:BEGIN时定义分割符 cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}' END:结束时执行 cat /etc/passwd | awk -F":" '{print $1} END{printf "以上为执行结果\n"}' NR:行号 df -h | awk '(NR>=2 && NR<=5) {print $5}' awk '(NR>=2 && NR<=5) {print $5}' /etc/passwd 打印行号: nl /etc/passwd | awk '(NR>=2 && NR<=5) {print $1}'
8.4sed:先取,新增,搜索,替换,删除
sed [选项] [动作] 文件名 选项和动作可以不写 -n:把匹配到的行打印 p:以行为单位进行查询,通常与-n一起使用 打印第二行: df -h | sed -n '2p' 打印包含2行: df -h | sed -n '/2/p' d:删除(不会对源文件修改的) 删除第二行: df -h | sed '2d' 把文本放到一个新的文件 df -h > newdf.txt sed '2d' newdf.txt a:在行的下面插入新的内容(不修改源文件) sed '2a 123456789' newdf.txt i:在行的上面插入新的内容(不修改源文件) sed '2i 123456789' newdf.txt c:替换 把第二行替换 sed '2c 123456789' newdf.txt s/str1/str2/g str2替换str1 sed 's/%0/100%/g' newdf.txt -i:对源文件进行修改(高危操作,必须先备份) sed -i 's/%0/100%/g' newdf.txt -e:表示可以执行多条动作 比如搜索内容时替换和打印两个动作 cat newdf.txt | sed -n -e 's/0%/100%/g' -e '/100%/' 搜索内容的方法: sed -n '/100%/p' newdf.txt cat -n newdf.txt | sed -n '/100%/p' 之前学过的grep搜索: cat -n newdf.txt | grep 100%
复习:
判断运算的问题
-e 目标是否存在: [ -e 1.txt ] || touch 1.txt -d 是否为路径 : [ -d /docker ] && echo '存在' -f 是否为文件 -r 是否有r权限: [ -r 1.txt ] && echo '有读权限' -w -x 整数: -eq 等于 [ 9 -eq 9 ] && echo '等于' -ne 不等于 -gt 大于 -lt 小于 -ge 大于或等于 -le 小于或等于 字符串: = 等于 [ 'ggg' = 'ggg' ] && echo '等于' != 不等于 小数:通过bc计算器 [ `echo '1.2 > 1.3' | bc` -eq 1 ] && echo '大于' 常用: [ $? -eq 0 ] 判断上一条命令是否执行成功
运算符号问题:
1.输出表达式的三种方法: expr 12 + 2 echo $[12 + 2] echo $((12 + 2)) 2.使用bc计算器(字符串交给bc处理) echo "1.2+1.3" | bc 结果:2.5 echo "scale=2;1.2+1.3" | bc 结果:2.5 echo "scale=2;(1.2+1.3)/1" | bc 结果:2.50
9.循环:
9.1循环的if
1. if [条件]; then 动作 fi 2. if [条件]; then 动作 else 动作 fi 例子:判断输入文件是否存在 #!/bin/bash if [ -e $1 ]; then echo "$1存在" else echo "$1不存在" fi 3. if [条件]; then 动作 elif []; 动作 fi 例子:判断输入的数字是否大于10 #!/bin/bash echo '请输入一个数字:' read number if [ $number -eq 10 ]; then echo "$number 等于10" elif [ $number -gt 10 ]; then echo "$number 大于10" else echo "$number 小于10" fi
9.2循环的for
1.格式: for 变量名 in 值1 值2 .... do 动作 done 例子:打印1-10 #!/bin/bash for i in 1 2 3 4 5 6 7 8 9 10 do echo $i sleep 1 done 2.格式 for 变量名 in `命令` do 动作 done 例子:打印1-100 #!/bin/bash for i in `seq 1 100` do echo $i done 例子:ping两下baidu是否通,通则断开 #!/bin/bash for i in $(cat a.txt) do ping -c 2 $i echo -e "\n" done a.txt文件内容 www.taobao.com www.qq.com 3.格式: for ((条件)) do 动作 done 例子:打印1-10 #!/bin/bash for ((i=1;i<11;i++)) do echo $i sleep 1 done
9.3循环的case:(匹配执行)
1.格式:(;;表示执行完后结束) case 变量 in 值1 ) 动作 ;; 值2 ) 动作 ;; 值3 ) 动作 ;; ... esac 例子:查询城市天气 echo '请输入城市' read city case $city in '广州') echo "$city温度23,热" ;; '四川') echo "$city温度24,热" ;; '大良') echo "$city温度25,热" ;; *) echo "输入有误" ;; esac
9.4循环的while
1.格式: while [ 条件判断式 ] do 动作 done 例子:计算0加到n的和 #!/bin/bash i=0 sum=0 while [ $i -le $1 ] do sum=$(($sum+$i)) i=$(($i+1)) done echo 'the sum is:'$sum