一. 回顾 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 回顾 // 将/home/目录下的所有文件和文件夹复制到/jindafu目录下 cp /home/* . -r // 复制/etc/hosts文件到jindafu,不给予覆盖提醒 用cp 的绝对路径 which cp 得到cp 的路径 /usr/bin/cp /etc/hosts . // 将xiena目录改名为xienana mv xiena/ xienana // 将singer目录下的所有文件复制到hejiong目录下 cp haiquan/singer/* hejiong/ // 删除所有的xienana目录 find命令 或 tree查看xienana在哪 rm -rf 路径 find /hunantv/ -name “xienana” -exec rm -rf {} \; // 查看目录结构 tree 查看类型 file // echo $PS1 $PS2 怎么看PS1 PS2 // hostname 查看主机名 // echo $SHELL 查看默认shell (是bash) // cat /ect/shells 查看机器里有哪些shell sh bash exit // d 目录 - 普通文件 l 链接文件 c 字符设备文件(显示) b 块设备文件 (磁盘) // reboot 重启机器 // clear 清屏 // 别名 alias , unalias , vim /root/.bashrc // env 环境变量 set 所有变量
二. . … 删不掉 1 2 3 // rm -rf 不会删除隐藏文件 rm -rf .lixh 删除隐藏文件 .和..删不掉
三. cat 1 2 3 4 5 6 // ls 查看文件夹里的内容 cat 1.查看文件里的内容 2.可以将多个文件连接到一起输出 -n, --number 给输出的行进行编号 用处2: cat tangliangfei.txt wangtc.txt (连接功能) 先将tangliangfei.txt内容输出,再将wangtc.txt内容输出
tac 与 cat 1 2 3 // tac 逆序显示,从最后一行到第一行 不能接-n cat 正序显示,从第一行到最后一行 (有-n选项)
四. 重定向 1 2 3 4 5 6 7 // > 输出重定向,会覆盖原来的内容,如果文件不存在会自动新建 重定向:就是将在屏幕上输出的内容,改变输出的方向,输出到文件里 >> 追加输出重定向,不会覆盖原来的内容,只是在末尾追加,如果文件不存在会自动新建 >会覆盖原来的内容,>>不覆盖,末尾追加 (学会cat 与>、>>的组合)
五. here document 1 2 3 // 生成指定内容的文件 --》here document --》主要用在写脚本生成指定的内容 // <<EOF 定义的结束字符串 当输入EOF的时候,结束 end of file
1 2 3 4 5 6 7 8 9 10 11 12 13 > chen peng (注2:1个>符号,原来内容会被覆盖) > jiangsu > xinhua > nongda > linux > cali > EOF (注3:点回车) > sanchuang > nongda > changsha
六. Shell 脚本 1 // shell脚本: 其实是一个文件,文件里面有很多的linux命令,这个文件可以执行,被执行的时候,会执行文件里的所有的命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 mkdir -p /test(注2:存在不报错,不存在就新建)cd /testmkdir sc{1..100}touch pengyf{1..100}.txtcp /etc/hosts /testcat >sanchuang.txt <<EOF(注3:回车后直接打,文本文件里没有提示符>) sanchuang hunan changsha furongqu hunannongda feng de yong linux EOF (注4:结束)echo "####################################" cat -n sanchuang.txt echo "####################################"
1 2 3 4 5 6 7 1 sanchuang hunan changsha furongqu hunannongda 2 feng de yong 3 linux // 脚本在执行的时候,是从第1条命令,自上而下执行,如果中间有命令执行失败,后面的命令还是会执行的(Python中间出错,没有异常捕获的话,不再执行)
七. more 1 2 3 4 5 6 // more命令 分页显示 (注1:没有-n选项,cat有-n选项) 用途:全屏方式分页显示文件内容 交互操作方法: 按Enter键向下逐行滚动 按空格键向下翻一屏、按b键向上翻一屏 back 按q键退出 (注2:显示完自动退出,与less的差别)
八. ps aux 九. less 1 2 3 4 5 6 7 // less命令 用途:与more命令相同,但扩展功能更多 交互操作方法: 与more命令基本类似,但个别操作会有些出入 【page down】【page up】上翻下翻页(注1:more不支持) 显示完不退出,按q退出 (注2:与more的差别) (注3:也支持空格、b、Enter,凡是more支持的less都支持)
十. head 1 2 3 4 // head命令(注1:默认取前10行,连续的几行) 用途:查看文件开头的一部分内容(默认为10行) 格式:head -n number 文件名 格式:head -数字 文件名
1 2 3 4 cat -n passwd |head 显示前10行,有编号head passwd 显示前10行,没有编号head -5 passwd 显示前5行(没编号)head -n 5 passwd 显示前5行(没编号,与上一条命令效果一样)
十一. tail 1 2 3 4 5 6 // tail命令 用途:查看文件结尾的少部分内容(默认为10行) 格式:tail -n number 文件名 格式:tail -数字 文件名 tail -f 文件名 = tailf # 注:tailf不知道怎么用 #注:tail -f 动态的监控文件末尾的变化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 tail passwd 取末尾10行(无编号)cat -n passwd |tail 取末尾10行(有编号)cat -n passwd |tail -5 取末尾5行(有编号)cat -n passwd |tail -1 最后1行(有编号)cat -n passwd |tail -n 3 取末尾3行(有编号)tail -n 2 passwd 显示最后2行tail -n -2 passwd 与上条效果一样tail -n +2 passwd 显示从第2行到末尾 (注1:用处:统计有多少行的时候,不想显示首行,统计磁盘挂载的时候不想看到标题这一行) (注2:df -Th 显示linux里的磁盘分区的使用情况) df -Th|tail -n +2 统计磁盘挂载不显示标题行 df -Th|tail -n +2|wc -l 统计行数 (注4:经常用来查看日志文件的变化,根据日志的记录去排错) (注2:重新打开窗口连过去,右边修改文件内容,左边动态监控文件末尾的变化,一有新的内容就显示)(注3:Ctrl+C 强行终止)
1 2 3 4 tail -f 扩展 特别适合看某些日志文件 /var 存放动态变化的文件 variable 变量,变化的,可变的 log 日志:是程序记录它发生的事情
1 2 3 (注3:别的窗口做操作,日志文件末尾动态更新)
十二. sed 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 1.取出passwd的第3行 2.取出passwd文件的第5行到10行 (注4:从第5行到10行,tail -6,不是-5) 3.取出第3行,第5行,第10行 练习3扩展 // sed -n 作用:只是显示符合要求的行(注9:不符合要求的行不显示) 1p;3p;5p 1p 显示第1行 p 是print 命令 ; 命令连接符号 (注10:用双引号””也可以) 总结:sed 1.显示连续的 2.显示不连续的
十三. grep 1 2 3 4 5 6 // grep 文本过滤 (过滤的是文件,不是文件夹目录) grep “root” /etc/passwd 包含root的行 grep “^liang” /etc/passwd 以liang开头的行 grep “bash$” /etc/passwd 以bash结尾的行 Ctrl + c 终止 // 文本处理三剑客 sed grep awk
十四. which 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 which 查找可执行文件并显示所在的位置 搜索范围由PATH环境变量指定 /usr/bin/mkdir -rwxr-xr-x. 1 root root 195192 4月 10 02:53 mkdir rwxr-xr-x 权限 r 读 read --》cat vim w 写 write --》 vim >> x 执行 execute ---》运行 -rw-r--r--. 1 root root…… (注1:脚本无可执行权限) -rwxr-xr-x. root root…… (注4:有可执行权限了) -bash: /lianxi/first_shell.sh: 权限不够 (取消可执行权限后不能直接执行)
whereis 1 2 3 4 5 6 7 8 9 10 11 12 13 // whereis 查找命令放到哪里(注1:跟which 很像)(注2:没什么用,man手册在哪里不是很重要) mkdir : /usr/bin/mkdir /usr/share/man/man1/mkdir.1.gz (注2:压缩文件,是它的文档) 1.查看命令安放路径 2.该命令man手册的路径(man的时候看的内容的存放路径) //whereis和which 的区别 Which不显示man手册的路径,whereis显示man手册的路径 mkdir : /usr/bin/mkdir /usr/share/man/man1/mkdir.1.gz /usr/bin/mkdir //whereis和which 都是到PATH变量里去找的 (共同点)
十五. PATH 1 2 3 4 5 6 7 8 //PATH是路径 which 命令在查找命令的时候,会到PATH变量指定的路径下查找/usr/bin/which: no fengdeyong in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) (备注1:红色为路径 备注2:多个文件夹用:冒号隔开) /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 查找的顺序是从左往右找,如果在第1个里面找到了,就不会往后面找,以此类推
深入理解 PATH 变量的作用 1.编写一个schello.c的文件
1 2 3 4 5 6 7 8 9 # vim schello.c (注1:编写脚本如下) #include <stdio.h> int main () { printf ("hello,world\n" ); (注2 :\n 换行) printf ("i am cali\n" ); return 0 ; } # file schello.c schello.c: C source, ASCII text (注3 :C语言文件,文本文件,机器不能识别)
2.编译成二进制程序文件
gcc 是linux里的一个编译器,将c源码文件编译成二进制文件
gcc 是linux里的一个编译器,将c源码文件编译成二进制文件
1 2 3 4 5 6 7 8 9 10 11 12 13 schello schello.c (注2:生成绿色可执行权限的文件 schello) 总用量 20 -rwxr-xr-x. 1 root root 12744 9月 18 15:12 schello -rw-r--r--. 1 root root 93 9月 18 15:08 schello.c -bash: schello:未找到命令 (注7:PATH变量没有当前所在路径,没有/lianxi/sc) (解决如下)
要让 Linux 系统知道我们的命令在哪里? 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 1.适应PATH变量,将我们的命令复制到PATH变量已有的路径下 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin hello,world i am cali /usr/local/bin/schello (注2:复制到PATH变量的路径下后bash可以找到schello) 2.修改PATH变量,添加我们自己的命令所在的路径 ①临时修改PATH变量 (注3:先引用PATH变量的值,在和/lianxi/sc:字符串拼凑在一起再赋值给PATH变量) (注3:$PATH ——》/lianxi/sc:+$PATH 重新组合——》赋值PATH变量 从右到左) /lianxi/sc:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin (注4:新的PATH变量,前面多了/lianxi/sc:) [root@sanchuang-linux sc] /lianxi/sc/schello hello,world i am cali ②永久有效 修改文件,添加PATH变量,让它永久生效 .bashrc这个文件是linux系统开机启动或者用户登录都会运行这个文件里的命令,所以才会永久有效 PATH=/lianxi/sc:$PATH (注1:打进去,放到最后一行)
1 2 3 4 5 6 7 8 9 10 11 12 13 // mkdir 用C写的 // >>> a = 10 (注2:提示符>>>) >>> b = 20 (注4:Python不需要编译,Python代码直接运行,用Python解释器去解释) >>> sg = "tangliangfei" >>> c = a + b >>> c 30 >>> print (sg) (注3:输出) tangliangfei >>> exit () (注5:exit ()退出出 exit ()是exit 函数)
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 //扩展 .py结尾的文件,是python程序文件 .sh结尾,shell脚本 .c结尾,c语言 (注2:申明脚本是Python脚本,里面的命令用Python3解释器去解释) username = input("please input your name:" )(注3:引号里面只是提示符,提示输什么) (注4:input()函数会接收你输入的东西,赋值给username) age = input("please input your age:" ) print (f"your name is {username} ,your age is {age}" )(注5:print (f ) 语法) (注6:{username}{age} 引用变量的值) schello schello.c sc_py_hello.py please input your name:cali please input your age:18 your name is cali ,your age is 18 [root@sanchuang-linux sc] -bash: /lianxi/sc/sc_py_hello.py: 权限不够 please input your name:wangtc please input your age:18 your name is wangtc ,your age is 18 //怎样让sc_py_hello.py 在PATH变量里运行 /lianxi/sc:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 总结:跟是用什么语言写的关系不大 1.把它放到PATH变量所在的路径里面,并2.给它可执行权限 就能直接运行 -bash: /lianxi/sc/sc_py_hello.py: 权限不够 总结:写的Python程序,一定要1.给它可执行权限,并2.把它放到PATH变量所在路径下面,不然不能执行 //扩展 (注2:总结:文件名字很长,想敲个短一点的命令,考虑用别名 [快捷键]) please input your name:feng (运行成功,条件是在PATH变量路径下和可执行权限,如上面的操作) please input your age:19 your name is feng ,your age is 19 alias sc_py_hello='sc_py_hello.py' /lianxi/sc/sc_py_hello.py
十六. bash 1 2 3 //bash 是linux非常好的shell解析器 (注1:2件事要做) 1.查找命令 --》PATH变量的路径下 2.告诉内核去启动命令(运行这个命令)
十七. /usr 1 2 3 // /usr 存放linux程序的目录 unix system resource /usr/bin 存放二进制程序,所有的用户都可以使用 binary /usr/sbin 存放二进制程序,有比较高的权限(root)的用户执行的程序 super user binary
1 2 3 4 5 6 7 /usr/sbin/useradd (注2:存放在sbin目录下) $ which useradd $ /usr/sbin/useradd $ useradd xu123 (注4:普通用户不能执行sbin/下高级别命令) ……报错useradd:Permission denied (注5:权限被拒绝)
十八. locate 1 2 3 4 5 6 // locate 知识点(注4:需要安装)(注5经常需要更新 mlocate-0.26-20.el8.x86_64 : An utility for finding files by name (注3:yum provides …… -y 查询某命令是哪个软件包提供的) (注2:从结果知道 mlocate提供locate命令)
1 2 3 4 5 6 7 8 9 locate命令 格式:locate 文件名 (注5:locate是到自己的数据库查找的,能具体到/下面,且必须更新自己的数据库) 根据每天更新的数据库(/var/lib/mlocate)查找,速度块 /var/lib/mlocate/mlocate.db database 数据库(注6:db的解释) 数据库里的内容还是根据/目录下的内容生成 每天会自动更新数据库 /var/lib/mlocate/mlocate.db 手动更新数据库updatedb
1 2 3 4 5 6 7 8 9 10 11 12 mlocate.db /usr/bin/mkdir /usr/lib/python3.6/site-packages/pip/_vendor/lockfile/mkdirlockfile.py /usr/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.opt-1.pyc /usr/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc /usr/share/man/man1/mkdir.1.gz /usr/bin/mkdir
1 2 3 4 5 6 7 8 locate查找的范围: /--》mlocate.db里去查找(注2:在 根下面自己的数据库mlocate.db下面去查找) 方式:模糊查找,文件名里包含就可以 缺点:新的文件,有时候找不到,因为没有更新数据库 --》updatedb(注3:手动更新) 可以查找任何文件(注4:新建的文件,# updatedb手动更新数据库,否则找不到) which 查找的范围:PATH变量 方式:精确查找(注1:文件名必须一模一样) 只能查找命令
which、whereis、locate、find 1 2 3 // which、whereis、locate、find 命令查找类 Which、whereis 只能找命令 loacte 也可以查找普通文件、可以查找任何文件
十九. find //* find命令
格式:find [查找范围] [查找条件] [动作]
find 可以找1.命令、2.文件 (即任何文件)
(注1:融合了which、whereis、locate所有功能)
find命令
用途:用于查找文件或目录
格式:find [查找范围] [查找条件] [动作]
常用查找条件
-name :按文件名称查找
-iname :按文件名称查找,不区分大小写
-size : 按文件大小查找
-user: 按文件属主查找
-type : 按文件类型查找
-perm :按文件权限查找
-mtime :按文件更改时间查找
-newer:按比某个文件更新的查找
1 2 3 4 5 6 7 8 9 10 11 12 -name和-iname /lianxi/lixh.txt /lianxi/sc/schello /lianxi/sc/schello.c /lianxi/sc/schello /lianxi/lixh.txt /lianxi/LIXH.TXT
1 2 3 4 5 6 7 8 -size (大小) du -ah 查看文件夹下的每个文件的大小 (单位K、M、G) /boot/grub2/fonts/unicode.pf2 (注3:查找的结果不是特别精准) /boot/initramfs-4.18.0-193.el8.x86_64kdump.img /boot/initramfs-4.18.0-193.el8.x86_64.img
1 2 3 4 5 6 -mtime (以24小时为单位) 按文件更改时间查找 -mmin (以分钟为单位)
1 2 3 -user (属于哪个用户创建的文件)(用处不大)
1 2 -newer (比指定文件更新的文件,后建的文件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 特殊查找条件 -o :逻辑或,只要所给的条件中有一个满足,寻找条件就算满足 or -not :逻辑非,在命令中可用“!”表示。该运算符表示查找不满足所给条件的文件 -a:逻辑与,系统默认是与,可不加,表示只有当所给的条件都满足时,寻找条件才算满and find /boot -size +1024k -a -name “vmlinuz*”(注1:逻辑与 -a可不加,系统默认逻辑与) find /boot -size +1024k -o -name “vmlinuz*” find . -user nie -type f -size +1k -o -name "vmlinuz*" find . -user nie -type f \( -size +1k -o -name "vmlinuz*" \) (注3:()改变了优先级,\解释在下方)(注5:\( \)即() 改变了优先级) find /home !-user hello -exec ls -ld {} \; \ 转义字符 (注2:因为小括号()有特殊作用,接上/以后让它表示只是小括号) 默认情况下-a的优先级高,先执行逻辑与(-a),再执行逻辑或(-o) (注4:前面先组合成一个条件,要么满足-o前面的,要么满足-o后面的条件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // 扩展,接上面的命令 -exec 和 -ok -exec 执行后面的命令 rm -rf 具体删除命令 {} 代表前面的find查找出来的内容,理解为一个容器存放前面find查找到的内容 \; 表示find命令结束符号 (注2:文件名.txt结尾的,大小大于1k的,文件,拷贝到fengdeyong里面) (注3:find 找/lianxi 下的每一层) -ok -ok 让你确认一下,再执行 < rm ... ./wangtc.txt > ? y < rm ... ./tang_wang.txt > ? y 总结:-exec 执行命令,不给与确认(写脚本常用,方便) -ok 执行命令,需要确认
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 -maxdepth 查找文件时,目录的深度 ./aa/bb ./aa/bb/bb ./bb ./bb ./aa/bb ./bb ./aa/bb ./aa/bb/bb ./bb (注1:不接-maxdepth的话,有多少层挖多少层) (注6:不接-maxdepth,东西太多了,挖的太深了) /lianxi/tangliangfei.txt /lianxi/chenpeng.txt /lianxi/cali.txt /lianxi/feng.txt /lianxi/aa/bb/feng.txt /lianxi/aa/feng.txt (注5:这种情况用的多,只想找1层的,只挖/lianxi下面的,子文件夹、子子文件夹下面都不要) /lianxi/tangliangfei.txt(注7:显示如下) /lianxi/chenpeng.txt /lianxi/cali.txt /lianxi/feng.txt
1 2 3 4 5 6 7 8 9 10 // !取反 的使用,接上面的命令(注1:lianxi下面的不是*.txt的) /lianxi /lianxi/passwd /lianxi/first_shell.sh /lianxi/messages /lianxi/sc /lianxi/LIXH.TXT /lianxi/aa /lianxi/bb