Linux常用命令复习
help # 学习的关键;help直接回车就是显示所有内部命令
eg: ls --help
type # 用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。 -t:输出“file”、“alias”或者“builtin”,分别表示给定的指令为“外部指令”、“命令别名”或者“内部指令”;
file 文件名 # 辨识该文件的类型。ELF为二进制编码文件,是不是可执行文件。windows右键属性。
yum install man man-pages # 通过yum安装man,操作手册man-pages
ps -fe # 查看进程,静止的 pstree # 多任务目录查看,两个bash代表两个用户
whereis # 定位命令位置
man utf-8 # 帮助信息 # man ascll;man 2 read
man wc
df # 磁盘空间与分区; df -h # sda3 根级目录的第三个分区,Windows是cdef,h代表human,人类可读的
useradd #添加用户。添加的用户归属于/ 目录,如果有个用户把内存占满了,可以让该用户的目录指向新加的硬盘。
umount /boot # 卸载boot目录的挂载 mount /dev/sda1 /boot # 挂载
du -sh ./* # s代表汇总,h代表人类可读取的
# du命令是对文件和目录磁盘使用的空间的查看
ll ls -la # 呈现列表的形式l, a代表所有的,i node号-磁盘位置。*****短的化可以两个一块*****;ls -l -ascll码才是最原始的, ls --help # 长字符 ls -l ./a* # 显示名称含a的文件 ls -l ./a?? # 显示名称含a的文件,?单个任意字符(正则表达式:[^12]取反)
ls -l /etc | grep "init"
cd # 回家 cd - # 上一次路径 cd .. # 上一级目录,. 当前目录 cd ~ # 家目录 cd ~用户名 # 回用户家;
clear
pwd
mkdir -p ./x/y/z/c/# 深度创建目录 mkdir -p ./x/{x,y,z}/ # 深度之后广度创建目录
rm -rf # f强制删除、r递归删除、rm -rf / 有点会提示危险,有的没有, rm -rf ./* # 删除当前目录所有文件
cp 文件 目录/文件 # cp /etc/{profile,init/inittab} ~
ln -s 文件 软连接 # 删除原始文件会提示错; ln 文件 硬连接;# 两个变量指向了同一存储位置
stat 文件 # 查看文件的描述性数据 -> 元数据:数据的描述性数据;
chmod +x 文件名 # 权限修改 chmod [u g o a] [+ -] [x w r]
touch 文件 # 把文件刷新成当前时间点;可以触发事件; touch 文件名 # 创建一个文件
cat 文件 # 读取文件并输出到shell
more 文件 # 读取文件并输出到shell,分屏显示后等你输入回车显示更多
less 文件 # 读取文件并输出到shell,分屏显示后等你输入回车显示更多,b回看
head -行数 文件 # 截取文件前面n行
tail -行数 文件 # 截取文件后面n行
head -i | tail -1 # 组合:读取第i行
echo "hello world" # 显示字符串到屏幕 echo $$ # 显示当前使用的进程id; echo -n "hello world" # 只换行,不回车 echo $PATH #查看PATH
tail -f 文件名 # 阻塞,可以另外打卡一个窗口 echo "hello world" 1>> 文件名
管道 head -3 文件 | tail -1 # 截取文件中间的多少行,基于文本流的加工方式 ls -l /etc | more # 衔接前面的输出和输入流,管道前后各是可以解析的字符串 echo "/" | xargs ls -l # xargs
vi +行号 文件名 # 排错 vi + 文件名 # 定位最后一行 vi + /字符串 文件名 # 打开 查找
grep -v 字符串 文件名 # 不含字符串的行 grep "\<xxoo\>" 文件名 # 查找含xxoo的行 grep "^xxoo" 文件名 # 查找开头含xxoo的行 grep "^xxoo\>" 文件名 # 查找开头含xxoo单词的行 grep "xx[0-9]oo" 文件名 # 查找:xx数字oo grep "xx[0-9]\+oo" 文件名 # 查找:xx多数字oo grep "xx[0-9]\{4\}oo" 文件名 # 查找:xx4个数字oo grep "xxoo.*ooxx" 文件名 # 查找:xxoo任意字符xxoo grep "\(xx\)\(oo\).*\1\2" 文件名 # 查找:xxoo任意字符xxoo
cut -d' ' -s -f1,3 文件名 # 以空格切割,显示第一三列; -s 成功切割; 1到3表示为1-3;
cat 文件名 | cut -d' ' -s -f1-3
sort -t' ' -k2 -nr 文件名 # 以空格切割,以第2列数值(-n)倒叙(r)排序
wc -l 文件 # wordcount
cat sort.txt | wc -l #统计文件行数
sed "1a\hello world" 文件名 # 给文件在1行后追加hello world,会输出到屏幕,源文件不会变; sed -i "1a\hello world" 文件名 # 给文件在1行后追加hello world,会输出文件; sed -i "2d" 文件名 # 删除文件第2行 sed -i "/apple/d" 文件名 # 删除文件中含apple的行 sed -i "s@hello@nihao@" 文件名 # 查找hello换成nihao sed "s/\(id:\)[0-6]\(:initdefault:\)/\15\2/" inittab # 查找id:x:initdefault: x换成5; 查找该替换的替换,不替换的不管
awk -F':' '{ print $1}' 文件名 #打印第一列,以:作为分隔符切割 awk -F':' '{ print $1 "," $7}' 文件名 # 以逗号分割 awk -F':' '{ print $1 "\t" $7}' 文件名 # 以制表符分割 awk -F':' 'BEGIN{ print "name\tshell"} { print $1 "\t" $7} END{ print "blue\tnosh"}' 文件名 # 以制表符分割,开头和结尾分别有标志
# 数据 awk.txt Tom 0 2012-12-11 car 3000 John 1 2013-01-13 bike 1000 vivi 1 2013-01-18 car 2800 Tom 0 2013-01-20 car 2500 John 1 2013-01-28 bike 3500 # 案例1 统计每个员工1月份的工资合计 # 输入 awk '{split($3,date,"-");if(date[2]=="01"){ name[$1]+=$5}} END{for(i in name){print i"\t"name[i]}}' awk.txt # $3第三列 # 输出 vivi 2800 Tom 2500 John 4500
cut -d':' -f1,7 文件名 | sed "1i\name:shell" cut -d':' -s -f1 文件名 # 打印第一列
sxt=100 # 变量定义 echo "$sxt" # 输出100 echo '$sxt' # 单引号可以组织字符串扩展,就是编译解释;输出$sxt
useradd sxt01 # 添加用户 useradd sxt02 # 添加用户 passwd # 给root用户改密码 passwd sxt01 # 给用户sxt01设置密码 ssh 用户名@ip # 登录 $ # 用户、资源、权限设置 # 1. 添加组 groupadd sharesxt id sxt01 usermod -a -G sharesxt sxt01 # a追加、G组 id sxt01 usermod -a -G sharesxt sxt02 id sxt02 # 2. 修改文件 chown root:sharesxt sxtshare/ # change owner; sxtshare目录; 用户:组 chmod g+w sxtshare/ # u g o a +/- rwx chmod o+rx sxtshare/ # 重新登录刷新权限 su sxt02 # switch user chown sxt01:sharesxt 文件名 # 将文件的拥有者设置为sxt01,群体的使用者是sharesxt
# install tar.gz tar xf 文件名.tar.gz # x撕毁,f文件。解压后会有一个Makefile # 打开README,Installation ./configure --help | more ./configure --prefix=/opt/sxt/nginx # 安装到/opt/sxt/nginx yum install gcc # 安装c编译环境,会补充缺失东西 yum search pcre # 查询yum库有没有pcre yum install pcre-devel # /install 查找install make make install cd /opt/sxt/nginx/sbin ./nginx 192.168.9.21:80
# install rpm rpm -ivh 文件名.rpm # i安装,vh详细信息; rpm -qa | more # 查询已经安装的所有包 rpm -qa | grep "jdk" # 过滤;例如jdk的java和javac whereis ifconfig mv /sbin/ifconfig /tmp ifconfig rpm -qf /sbin/ifconfig # 查询/sbin/ifconfig是由于那个包产生的(追根溯源) mv /tmp /sbin/ifconfig umount /mnt # 卸挂载 mount /dev/cdrom /mnt # 挂载 /dev/cdrom 光盘, /mnt目录 ls -l | wc -l # 算下当前目录有多少个文件 ls -l httpd* # httpd开头的文件 yum install wget #https://mirrors.163.com/ 帮助 yum clearn all # 清除 yum makecache # 同步元数据信息 yum repolist # 显示有的仓库 yum update # 更新 yum list | more # 罗列
# 中文支持; yum grouplist | more yum groupinstall "Chinese Support" # 空白符敏感 echo $LANG LANG=zh_CN.UTF-8 # 中文文档 # https://developer.aliyun.com/mirror/ # epel yum groupinstall "Eclipse"
# 输入与输出重定向
cd /proc/$$/fd #启动后会有 pwd ps -fe | grep nginx # 进程状态,查nginx # 每个程序都有基本的流0 1 2(文件描述符);0:输入,1:标准输出,2:错误输出; # 输出 # 覆盖重定向 ls -l / 1>ls.txt # > :重定向; # 追加重定向 ls -l / 1>>ls.txt # > :重定向; # 错误输出 ls -l /god 2>ls.txt # 没有/god # 两者都有 ls -l / /god 1>ls03.txt 2>ls04.txt # 不同文件 ls -l / /god 1>>ls05.txt 2>>ls05.txt # 相同文件 ls -l / /god 1> ls06.txt 2>& 1 # 1指向文件,2指向1;文件描述符可以互相指向 ls -l / /god >& ls08.txt # 特殊写法 ls -l / /god &> ls09.txt # 特殊写法 history # 显示历史命令 # 文件描述符(1)重定向操作符(>)文件(ls.txt) # 输入 read sxt # 打开输入阻塞,接收输入的字符到sxt直到出现换行符; echo $sxt read 0<<<"hello" read sxt 0<<<"hello" echo $sxt read sxt 0<<XXOO dada fsgfsdg daffgg XXOO echo $sxt # 输出daffgg # 输出一些东西 vi h.txt # 写入 { echo "hello" echo "nihao" echo "byebye" ls cat 0<<OOXX hello nihao byebye OOXX } # 推荐这个 source h.txt cat 0< h.txt # 打印百度:模拟浏览器方法,Http协议属于7层协议,后面还有个4层协议 # 1. 建立链接:Secoke描述上打开文件->流 help exec exec ls -l # pstree查看是否是一个bash。 cd /proc/$$/fd # 查看当前的进程 exec 8<> /dev/tcp/www.baidu.com/ # 多了一个8,建立了一个链接与8号文件描述符打通了 echo -e "GET / HTTP/1.0\n" echo -e "GET / HTTP/1.0\n" 1>& 8 cat 0<& 8 # 考验手速
# shell及脚本的执行方式 sxt =100 echo $sxt type source bash # bash 是一个程序,可以单独启动一个bash # 编写一个文件file.txt { #!/bin/bash # 这个是写的对应的解释器 echo "hello.txt" echo $$ echo $sxt ls -l / } # 四种执行方式 [1] source file.txt [2] . file.txt [3] bash file.txt [4] chmod +x file.txt # x代表执行,绿色; ./file.txt # 区别,[1,2]是当前的bash,[3,4]是新bash # 变量 sxt =100 echo $sxt # 方法或函数:一切皆命令;命令有内部命令,外部命令(执行程序、脚本、文本、函数方法) sxt01(){ echo "hello.txt" echo $$ echo $sxt ls -l / } sxt01 type sxt01
# 变量
# local变量 sxt(){ local sxt1=100 echo $sxt1 } sxt # 打印100 echo $sxt1 # 打印空,因为local变量只在函数内有效 vi h1.txt # 写入 { echo $# #参数个数 echo $* #参数列表 echo $@ #参数列表 echo $$ #当前进程pid echo $BASHPID #当前进程pid;管道|两边会触发子进程,两个bash;$$优先级比|高 echo ${1} echo ${2} echo ${11} } . sh01.sh 1 2 3 4 5 6 7 8 9 0 a b c sxt="sxt" echo {sxt}good ls -l # 执行正确 echo $? # 0 每个命令完成都有个退出状态,$?取出上一个命令的退出状态,0成功,非0错误 ls /god echo $? # 2 bash # 新建立子进程;新建立子进程后,定义的变量会消失; export sxt # 导出当前子进程数据 bash sh02.sh # 文件里边写的是 echo $sxt bash sh03.sh & # 后台运行脚本 # 引用 echo $sxt echo "$sxt" #可以替换,就是变量,命令在执行上会删除引用 echo '$sxt' # 阻止替换 # 命令替换 var01=`echo $sxt` var01=`echo $(echo $sxt)` # 退出状态 echo $? # 逻辑判断 ls -l / && echo ok ls -l /gof || echo ok # 算数表达式 a=1 b=2 ((a++)) echo $a c=$((a+b)) echo $c # 条件表达式 help test test 3 -gt 8 # >重定向操作,gt大于 echo $? # 1 test 3 -gt 2 echo $? # 0 test 3 -gt 2 && echo ok type test # shell builtin type '[' # shell builtin [ 3 -gt 2 ] && echo ok # 这个写法推荐 # 练习 # 添加用户 # 静默运行脚本 # 避免捕获用户接口 # 程序自定义输出 # 用户密码同用户名 vi userAdd.sh { #!/bin/bash [ ! $# -eq 1] && echo "args erro..." && exit 2 # 输入参数为1向下执行,写命令时候尽量用&& id $1 &> /dev/null && echo "user exist..." && exit 3 # 输出到数据黑洞 useradd $1 &> /dev/null && echo $1 | passwd --stdin $1 &> /dev/null && echo "userAdd succeed." && exit 0 echo "wo ye bu zhi dao ..." && exit 9 } chmod +x userAdd.sh ./userAdd.sh sxt03 id sxt03 su sxt03 ./userAdd.sh echo $? ./userAdd.sh sxt04 echo $? man passwd # ssh root@192.168.9.21 # bash的7步扩展?命令替换
# 流程控制 help if if ls -l / ; then echo "ok"; else echo "no ok"; fi help for for ((i=0;i<10;i++)); do echo $i; done for i in xada aff afaf; do echo $i; done seq 3 # 输出1-3 for i in `seq 10`; do echo $i; done # `seq 10` 将其当作命令 help while mkdir /god while ls -l /god; do rm -rf /god; echo "ok"; done # 练习 # 用户给定路径 # 输出文件中最大的文件 # 递归子目录 ll du -a du -a | sort -nr # 使用数据排序n,倒序r vi findMax.sh { #!/bin/bash oldIFS=@IFS #默认以空白、制表符、换行符进行切分 IFS=$'\n' #使用换行符切割 for i in `du -a | sort -nr`; do echo $i fileName = `echo $i | awk '{print $2}'` if [ -f $fileName ]; then echo $fileName exit 0 fi done IFS=oldIFS } ./findMax.sh ./ # 新建shell执行 . findMax.sh ./ # 当前shell执行,会销毁当前进程,exit指代当前进程 # 练习 # 循环遍历文件每一行:流程控制语句 # -定义一个计数器num # -打印num正好是文件行数 vi test.txt { a 1 b 2 c 3 } vi test.sh { #!/bin/bash echo "**************way1**************" oldIFS=@IFS IFS=$'\n' num=0 for i in `cat test.txt`; do echo $i ((num++)) # (()) 可以免去$的使用,里边就是变量,不是字符串 done echo num:$num IFS=oldIFS echo "**************way2**************" num=0 lines=`cat test.txt | wc -l` for ((i=1;i<=lines;i++));do line=`head -$i test.txt | tail -1` echo $line ((num++)) done echo num:$num echo "**************way3**************" num=0 while read line; do # read对换行符特别敏感 echo $line ((num++)) done < test.txt # 输入重定向 echo num:$num echo "**************way4**************" # 右边开启两次子进程 num=0 # 管道的父子进程,父子进程是导出,而非共享; # 管道开始时候,左右两个各自启动一个子进程,将左边进程的输出作为右边进程的输入; # 此时前面的num=0的命令执行的时候是父进程和这两个没有关系; cat test.txt | (while read line; do echo $line ((num++)) done; echo num:$num) echo "**************way5**************" # 右边开启一次子进程 num=0 cat test.txt | {while read line; do echo $line ((num++)) done; echo num:$num);} # 大括号最后一个命令需要; } ./test.sh ./ vi text.sh { $1 $2 $* $@ echo "------------$*----------------" for i in "$*"; do # $*会把参数列表作为一个元素 echo $i done echo "------------$@----------------" for i in "$*"; do # $*会把参数列表按照空白切割 echo $i done } . text.sh a b b d e f g
视频链接:https://www.bilibili.com/video/BV1Nb411P7Mf?p=23&spm_id_from=pageDriver