目录
[输出重定向 >](#输出重定向 >)
[输入重定向 <](#输入重定向 <)
[命令行管道 |](#命令行管道 |)
食用说明
我也是Linux的初学者,这篇博客主要记录学习到的Linux中常见的基本指令,基本都是对目录和文件的操作,就相当于在Windows上对文件(夹)的新建、删除和查看等...
第一次接触Linux的时候觉得Linux好神奇好特殊,但学习一点后发现Linux和Windows一样都是操作系统,看上去Windows有更好理解的各种图形和页面,而Linux只有冰冷的文字,但是指令和图形化界面没有区别,而且图形化界面也是建立在指令之上的。所以,话不多说...
以下指令不是循序渐进的,掺杂着稀碎的基础知识的同时,它们有许多有较强的关联性和相似性。所以看不懂或懵懂的时候可以尝试先往下看,之后再回过头来(ooooo~第一次自己切身理解到书读百遍其义自见)。我用灰色的快引用来叙说一些相关的其他知识补充,用红底背景 代表输入的指令,墨绿色表示该指令的功能,前面有一个点代表具体指令,截图是自己的运行结果。另外,i'm初学者,愿意接受任何批评指正和建议~
用户管理
一台机器是可以支持多个账号的登录和使用的。每台机器都有一个超级用户root,其他都是普通账号。
- 首先可以在命令行输入ssh root@自己的公网IP 回车后输入密码登录root账户
- adduser whh即可创建一个名为whh的用户
- passwd whh 设置用户whh的登陆密码(密码是不回显的)
- 之后只要 ssh whh@公网IP可登上whh账号
- userdel -r whh 在root账号上操作可删除whh账号
whoami/who
登录一台机器后可以通过以下指令查看身份,以及当前登录的账号和时间记录。
- whoami 查看当前账号是谁
- who当前有那些人登录此机器
root账号登录查看whoami是root,此时who也只有一条记录,登录另一个账号,再次查看who能看到两条记录,如果另一个机器下线,则又恢复一条记录。
clear
- clear 清屏,从头开始输入命令,但是之前的内容并没有消失,回翻还能查看。
tree
目录结构和路径
在此之前要介绍一下Linux中的目录结构是一颗多叉树(目录可以理解为文件夹,Linux中习惯称为目录)。并且叶子节点一定是普通文件或者空目录,非叶子节点一定是目录。而访问一个文件的本质就是在一颗多叉树中进行节点的查找。
比如以下,如果要找到"写给小美的情书"可以通过点--->C盘--->学习资料--->笔记--->新建文件夹--->写给小美的情书 找到。在Windows中他的路径表示为 C:\学习资料\笔记\新建文件夹\写给小美的情书。由此可知路径是由路径分隔符 分割起来的一串由文件夹构成的字符串。这里的 \ 就是Windows下的路径分隔符,Linux下也有差不多的路径的概念,但是其路径分隔符为**/**。关于绝对路径和相对路径在cd小节下。
几乎所有的操作系统的目录都是树状的,联系Windows就很容易理解了。
Linux下新建文件夹或文件都是没有图形化界面显示的,不能直观地观察到目录结构,而tree正是解决此问题的好帮手。不过系统默认是没有这个指令的,可以通过输入yum install -y tree来下载该指令Ubuntu可以输入apt - get install tree 下载。
- tree 可直接使用,会以树状形式显示当前目录
- 也可以在后边加路径tree /root/whh/command就会以树状结构打印该路径的叶子节点的目录
- 也可以tree . tree .. tree ../xxx
- tree -a 显示包括隐藏文件的目录结构
目录为空时显示↓
pwd
显示用户当前所在的目录
- pwd 显示当前所在的目录。
在任何时候输入pwd,就会输出当前所在的目录(就是告诉你当前的目录)。
(如果啥都不干,就一直在/root目录下,此时pwd会得到)
(当我进入到command中,再pwd得到)
ls
对于目录,该命令列出该目录下的所有子目录与文件;对于文件,将列出文件名以及其他信息。
- ls打印当前目录下的所有未隐藏的子目录与文件(在以上我已创建的目录结构的基础上,在/root目录低下输入ls可得到↓,它不会把其子目录的子目录打印出来)
- ls -l 输出更详细的文件目录信息(文件名+文件属性),由于ls -l非常常用,有了更简便的写法 ll。
文件
文件=文件内容+文件属性。空文件在磁盘中也是占了空间的(文件名、大小等属性数据)。
文件操作的本质是对文件内容或文件属性操作。
- ls -a显示所有子目录和文件(包括隐藏文件)
隐藏文件
Windows中有很多文件由于不想让用户使用查看或者修改等原因有隐藏文件的功能,选择显示隐藏文件就会出现。Linux中也有此概念,上面的截图中出来whh和learn还有很多其他文件。也可以发现Linux中的文件都以.开头,创建文件时,如果以一个点号开头则自动变为隐藏文件。
另外,仔细看上图会发现前面有奇怪的三个点。以上面的知识,难不成这也是文件?答案是肯定的。它们代表两个特殊的目录。. 表示当前目录,即当前路径。 ..表示上级路径。任何目录下都有两个这样的文件。 之前提到的tree代表以树状显示当前目录,其作用等同于tree . ,与之相对的,tree .. 则表示以树状结构显示上一级目录。. 就代表现状, .. 相当于Windows中的回退键(← →)。
- 前两个指令里的 -l 和 -a 被成为选项,是可以组合在一起使用的, ls -a - l 与 ls -la 是等价的。
常用选项
- 此外ls后也可以跟路径。
cd
改变当前工作目录
我们已经知道了路径的知识,但是要怎么进入一个目录呢?答案就是cd指令。在ls的隐藏文件中我们已经知道 . 和 **..**的区别,前者代表当前路径,后者则是上级路径,所以
- **cd .**在当前位置不动,这是一条无用指令(就像别人提醒你要呼吸一样多余)
- cd .. 回退,去上级目录(注意空格)
- cd ../.. 到上级目录的的上级目录,即回退两次
家目录、根目录、绝对路径和相对路径
至此可能会有一个疑问,如果一直输入cd .. 会怎样?答案是会回到根目录。Linux下的路径一般都是/root/xxx/xxx...,是以 / 开头的,这个**/** 就是根目录。可以理解为一整个Linux系统里的东西都装在这个目录里,从这个根开始,以多叉树的样子开展。
从/root/whh/command一直回退到根目录通过pwd指令可以发现,我们一登上账号并不是在根目录下的,如果是root账号那我们在**/root** 下,如果是普通账户,就在**/home/xxx** 下,这两个就是家目录,/root是root账号的家目录,/home/xxx是xxx这个普通账户的家目录。它们都是在根目录下的。(Windows中,有桌面的概念,但其本质也是目录,只不过其家目录里有桌面文件,当用户登录的时候,Windows把这个文件夹中的所有文件(夹)以图标的形式显示在显示器上,才有了我们眼中的桌面。)
在知道根目录后,再来理解一下路径。路径可以分为绝对路径 和相对路径 。我们把从根目录开始定位一个叶子节点的方式所形成的路径叫做绝对路径,而以自身所处的目录为参考点,定位一个文件的路径称为相对路径。如下图要找到左边的bin,其绝对路径为/user/bin,如果此时我们在etc的passwd中想要找到bin所形成的路径为../../user/bin。
- cd - 跳转到最近一次所处目录(可实现在两个目录之间来回横跳)
- cd ~ 回到当前目录的家目录
- cd 绝对路径/相对路径 (如cd /user/bin cd ../../user/bin)
touch
创建文件
- touch xxx创建一个名为xxx的文件
- touch t1 t2 t3 同时创建三个文件,文件名分别为t1,t2,t3
- stat 文件名 查看文件更详细的属性列表,如我创建了一个名为t1的文件后,查看↓
(其中下面有三个时间,分别代表的是Access:文件最近一次被访问的时间 Modify:文件内容最后一次被修改的时间 Change:文件属性最近一次被修改的时间。以下是我刚新建了这个文件就直接执行指令后的结果,所以三个时间都是一样的,这个指令可能以后配合它的选项比较有用...)
常用选项
(我不常用,还不懂(#^.^#))
-a 或--time=atime或--time=access或--time=use只更改存取时间。
-c 或--no-create 不建立任何文档。
-d 使用指定的日期时间,而非现在的时间。
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m 或--time=mtime或--time=modify 只更改变动时间。
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
-t 使用指定的日期时间,而非现在的时间。
mkdir
创建目录
- mkdir dira 创建目录
- mkdir dirh dirg dirj 建立一连串目录
- mkdir -p dirb/dirc/dird (递归式创建目录)创建一串新路径 一定要加 -p 选项
rmdir/rm
删除目录或文件
- rmdir dirg 删除名为dirg的空目录(如果不是空目录删除不了)
- rm -r dirb递归式删除目录(删除不为空的目录)会询问
在删除时,它一直会问你是不是要删,可以输入y或者n,一直y就好了,如果要输入y/n的地方输错了(没按回车的情况下)只能使用ctrl+backspace删除修改。但是如果你觉得这样很烦,不需要它询问,可以执行强制性删除↓
- rm -rf dirb 强制删除此目录(无交互)
- rm t1 删除名为t1的文件,会询问(输入yes和no,y和n 都是可以的)
- rm -f t1 强制删除名为t1的文件,不询问
- rm -rf * 强制删除当前目录下的所有文件(包括当前目录下的子目录)
- rm -rf 相对路径/绝对路径 * 强制删除制定目录下的所有文件
但是rm -rf * 默认不删除隐藏文件(隐藏文件可以明确指定删除 rm -rf .test),只是不删除当前目录下的隐藏文件,子目录下的隐藏文件都删了。
eg.我在three目录下创建了这些文件
进入dirb 输入 rm -rf * 之后
在three目录下执行rm -rf *
但是但是但是,删除时有询问这样的交互式只在root账号下才有,普通用户删除目录和文件,指令也是这样,但是如果想要它询问呢?带上一个 -i选项
- rm -i file.txt (普通账号)删除名为file.txt的文件,删除时询问
- rm -ri dira (普通账号)递归式删除名为dira的目录,删除时询问
man
查看联机手册
Linux中有许许多多的指令,可能忘了某个或不认识,就可以通过这个手册查看(当然日常学习中百度谷歌博客可能是更得力的助手)。
云服务器上可能默认没有,可以通过 yum install -y man-pages 下载
- man ls 查看ls指令,查看完成后输入q退出,通过u和d实现上下翻动
- man man 查看man自己这个指令
(通过上条指令会发现里面一共有9号手册)每次默认从一号手册开始查找,找到就停止。
比如printf在C语言中是一个打印函数,在Linux也具有同样的功能,但他们在不同的手册,所代表的含义也是不同的,所以可以指定手册寻找,内容是不一样的。(3号手册是库函数)
man printf
man 3 printf
另外printf在Linux中的使用时这样↓的,格式化输出,直接打印在屏幕上
printf "hello %d, hello : %f, hello :%s\n" 123 3.14 "hello"
- man 1 查看1号手册
- man [手册编号] [查找的内容]
cp
拷贝文件或目录
- cp 被拷贝的文件/目录 拷贝过后的文件/目录
- cp ./file.txt .. 把当前目录下的 file.txt 文件拷贝到上级目录下
- cp file.txt file.txt.bak 把当前目录下的file.txt拷贝到file.txt.bak里,也保存在该目录下(cp file.txt . 是不行的,因为同级目录下,不允许存在同名文件或同名目录)(file.txt 和 file.txt.bak 只是文件名而已,这样比较有意义能看懂)
目录是不能直接拷贝的 ,cp dira 是错误的,要带上 -r 的选项
- cp -rf dira .. 强制 拷贝目录到上级目录
- cp -rf diar dira 理论上是不行的,实际上也会报错,但是还是会变成子目录拷进去
- cp -rf dira dira.bak 当前目录下diar拷贝到新目录dir.bak中
- cp -rf dira /home/whh/mydir 改名拷贝(mydir之前是不存在的)
- cp -rf /home/wjw/mydir/* now 把mydir下的所有内容拷贝到now中(隐藏文件不会被拷过去)
mv
移动目录或文件
- mv file.txt ../ 把file.txt移动到上级目录
- mv ../file.txt . 把上级目录中的file.txt 移动到当前目录
- mv file.txt ../f.txt 移动并重命名
- mv dirh dirj 把名为dirh的目录移动到名为dirj的目录中
- mv dirj dirb 如果当前目录下没有dirb,其作用就相当于将dirj重命名为dirb
mv的重要作用不仅是移动,还有可以用于重命名
当我们写一个C语言的文件a.c 通过gcc可以形成可执行文件a.out 命令行中输入./a.out就可以运行当前程序了,如果我们现在 mv a.out mycmd 此时输入mycmd就可以运行这个程序了。只不过只能在当前目录下使用,如果cp mycmd /usr/bin/mycmd那么在哪个目录底下都能使用,而这个步骤我们就把它叫做安装,相对的,卸载就是rm usr/bin/mycmd。命令的本质就是可执行文件。
此外还有一个专门改名的指令alias是别名。alisa ok = 'ls -s' 那么之后输入ok就相当于ls -s。不过一般在命令行中起的别名XShell关机之后就消失了。
cat
查看目标文件内容
在查看文件之前首先要了解一些修改文件内容的指令,否则查看就毫无意义
nano
相当于Linux里的记事本
可以先通过 yum install -y nano 下载
nano file.txt 创建一个记事本,输入后会出现另一个界面,在里面输入内容Ctrl + X退出,它会询问是否保存,输入y再退出就创建完成了,但是如果里面什么都没写就不会创建这个文件
echo
echo "Hello Linux" 在屏幕上输出Hello Linux
echo "Hello Linux" > test.txt 把"Hello Linux"写入test.txt(如果没有这个文件会自动新建)
输出重定向 >
上面指令中的 > 就叫做输出重定向(echo默认向显示器打印重定向后显示到文件中)
> test.txt
- 如果当前没有这个文件,新建一个文件夹,差不多等价于echo " " > test.txt
- 如果存在该文件夹就是清空目标文件
为什么会有清空目标文件的功能呢?因为输出重定向每次对文件清空再进行写入。
所以当连续输入
echo "111" > test.txt
echo "222" > test.txt
echo "333" > test.txt
后,最终test.txt里只剩下333了
不过如果不想先清空再写入,可以使用 >> (追加重定向),如果此时又执行
echo "444" >> test.txt 文件里就会增加444而不是只有444
printf默认不带换行 echo默认带换行
我先创建了一个有如下内容的文件file.txt
- cat file.txt 输出file.txt中的文件内容,直接输出在屏幕上
- cat -n file.txt 对输出所有行编号
- cat -s file.txt 不输出多行空行(多行空行变一行空格)
- cat -b file.txt 对非空行编号
- tac file.txt 逆向输出文件内容
- cat 后面可以什么都不跟,此时我们输入什么,屏幕上就打印什么(可以通过Ctrl + C 退出)
输入重定向 <
你可能会觉得上一条没什么用,但是上一条可以理解为,cat从键盘文件中读取什么,就向显示器文件写入什么(cat默认读取的时候,就是从键盘文件输入的),那么...要是把键盘文爱你更改成其他文件呢?
cat < file.txt 就可以打印file.txt 文件中的内容了
< 输入重定向 把本来应该从键盘中读入的内容更改成为从普通文件中进入输入
一个没注意以为有多特殊呢,其实和 cat file.txt 所做的完全一样。(不过以后会有区别)
more/less
查看文件内容
可以当做是升级版的cat,它俩可以带选项
为了更好的演示,先创建一个大文件
i=0;while [ $i -le 10000 ]; do echo "Hello $i"; let i++; done > test.txt就是输入10000行Hello i 到test.txt文件中
如果此时用cat test.txt 查看这个文件,就会一下子打印到底,翻看起来很费劲。
- more test.txt 从头开始显示该文件,可以按回车下翻查看文件,但是无法上翻
- less test.txt 可以通过回车,↑↓来翻看,在 :后输入数字,表示向下跳转几行
(不同的机器可能有所差异,可以通过h查看一些键的作用)
-i 忽略搜索时的大小写
-N 显示每行的行号
head/tail
显示文件开头或末尾内容
- head test.txt 默认打印前十行
- head -5 test.txt 打印文件前五行
- tail test.txt 打印文件后十行
- tail -20 test.txt 打印文件后20行
通过两种结合可以打印中间部分(如250-260行)
++方法一++:创建临时文件,先把前260行打印到另一个文件,在打印新文件的后十行
head -260 test.txt > tmp.txt
tail -10 tmp.txt
但还是创建了文件,浪费了空间
++方法二++:通过管道结合两条指令
head -260 test.txt | tail -10
命令行管道 |
上面 head -260 test.txt | tail -10 中的**|** 就被成为管道,可以实现指令的结合实。
head -260 test.txt | tail -10 | tac 在刚刚的结果上进行逆置
head -260 test.txt | tail -10 | head -3
head -260 test.txt | tail -10 | less
date
输出时间
- date 输出此时刻的时间
这些时间也可以被格式化输出
- date +%Y 显示年份
- date +%Y-%m 显示年月
- date +%Y-%m-%d/%H:%M:%S 显示年月日时分秒
注意:年月份时分秒分别对应着YmdHMS,大小写不可以改,+号不能变,其他分隔符可以自定义,出来date后有一个空格,其他都不能加空格。
- date +%s 显示的是时间戳
时间戳
表示的是++1970年1月1日00:00至今的秒数++,它是一直递增的(因为我们在东八区,所以在中国的时间戳就表示当然08:00至今的秒数)
一般一个软件的开发都会伴随着一个日志,辅助程序员进行问题的排查,里面的时间记录大部分就是用时间戳记录的,总之它还是有点重要的。
- date -d @1714720079 把时间戳的时间转化为正常时间
- date +%Y-%m-%d/%H:%M:%S -d @0 格式化输出由时间戳转化为正常时间的时间
cal
查看日历信息
- cal 查看当月日历
- cal 1949 查看1949年的所有日历
- cal -选项
find
查找文件
find /root/whh -name test1 找出在该路径下的所有test1文件
which、whereis
find /usr/bin -name pwd 用find找指令pwd
which pwd 用which找指令pwd(which指令用于查找指令)
whereis 查找包含指令在内的头文件压缩包、命令等一切文件
whereis file.txt
可以查找 whereis stdio.h 也可以 whereis stdio.*
*是通配符
find /home/whh test.*
grep
在文件中搜索字符串,将找到的行打印出来
先创建一个文件,以便观察
- grep 'A' test.txt 找出包含'A'的行
- grep -i 'A' test.txt 忽略大小写,找到含A或a的行
- grep -n 'A' test.txt 找到并标出行标
- grep -v 'A' test.txt 把不包含'A'的行匹配出来
sort、uniq
- sort test.txt 按ASSCLL码值进行行排序
- sort -r test.txt 逆向排序
- uniq test.txt 相邻的行如果出现重复,只保留一行
- uniq -u test.txt 显示唯一行(只比较相邻行)
- uniq -d test.txt 显示重复行
- sort test.txt | uniq 先排序再去重(有效去重)
- sort test.txt | uniq -c 列出没去重时各有几行
- sort test.txt | uniq wc -l 列出去重之后一共有几行(wc 字符统计)
- cat test.txt | grep 'B' | sort | uniq | wc -l 列出包含'B'去重之后有几行
zip/unzip
打包压缩/解压
打包压缩:多个文件变成一个文件,防止文件丢失(节省空间,网络传输时更节省时间)
- yum install -y zip
zip command.zip command 这样默认是不打印目录下的内容的
- zip -r command.zip command 打包压缩
- unzip command.zip 解压
- unzip command.zip -d test 解压文件到test目录下
tar
打包/解包
tar 选项 dst.tgz scr_dir
由于这个指令选项比较多,列几个常用的组合
- tar -czf command.tgz command
-c 创建
-z 要压缩
-f 新名称
- tar -cvzf command.tgz command
-v 把打包过程打印出来
- tar -xzf command.tgz
-x 解包
-z 解压
- tar -xvzf command.tgz
- tar -xvzf command.tgz -C test 解压到指定目录
uname
获取电脑和操作系统的相关信息
- uname -a
- uname -r 技术发行版、商业化发行版、芯片架构
- cat /proc/cpuinfo CPU信息
- cat /proc/meminfo 内存使用情况
关机
一般服务器是永远不关机的,关机了只能在网页后端开机了,但是关机也有指令
- shutdown -t 30 30秒后关机
- shutdown -n 立即关机
- reboot 重启
Linux和Windows互传文件
yum install -y lrzsz
- rz -E 之后可以通过直接选择Windows中的文件保存到当前目录下
- sz test.txt 后选择保存路径,就可以把Linux中的文件传给Window
++两台Linux之间文件传输++
先打包 tar -czf command.tgz command
scp command.tgz root@ip地址:/root/whh 其中scp是远程拷贝的意思
一些热键
- Ctrl + insert 复制
- shift + insert 粘贴
- ↑ ↓ 可以输入历史指令
- history 历史输入指令
- 输入a后按Tab一两次就会出现以a开头的指令
- 直接按Tab一两次能输出所有指令
- Ctrl + C 终止进程
- Ctrl + d 退出 一直退出,直到退出登录,退出Xshell
-The End-