Linux
文章目录
- Linux
-
- 命令
-
- [su - 、sudo 与 exit](#su - 、sudo 与 exit)
- Ed
- bc
- cal
- date
- fdisk
- help\man
- touch:触碰文件
- stat:查看状态
- dd:对文件进行数据传输
- mkdir:创建目录
- cp:拷贝
- mv:移动文件
- rm:删除文件
- rmdir:删除空目录
- ls:查看文件
- ln:创建链接
- file:查看文件类型
- od:按字节查看文件内容
- hexdump:按字节查看文件内容
- wc:显示文件的行数,单词数,字符数。
- mail:给不同用户发送邮件
- 文件的Inode
- 文件名通配符
- 特殊字符与引用
- IO重定向
命令
su - 、sudo 与 exit
su - 切换为管理员模式,即root。
sudo以管理员的方式运行指令。
exit退出管理员模式。
Ed
ed编辑器命令参数:
bash
a - 在文件的末尾添加新内容
i - 在文件的最后一行之前插入新内容
c - 把文件输入的最后一行替换成新的内容
. - 退出编辑模式,进入命令行模式
w [文件名] - 保存文件
q - 退出ed编辑器
p - 打印某行
$ - 表示最后一行
, - 表示所有行
n - 打印某行
// - 搜索
在最后第3行替换成新的内容,可以把-c改成-3c。
关于p的用法,也可以用1p,表示打印第一行,$p表示打印最后一行。除此之外:
bash
1,$p
表示从第一行打印到最后一行。类似的用法有:
bash
$-2, $p
表示从倒数第三行打印到最后一行。
同样可以使用逗号:
bash
,p
表示打印所有行。
打印还有一种方法:
bash
5n
用法和效果同5p,打印第五行。同样可以用
bash
,n 和 1, 3n
分别表示打印所有行;打印1到3行。
搜索方法,在两个斜杠之间加入需要搜索的内容即可。
bash
/great/
表示搜索含great的第一行,然后直接输入:
bash
//
可以继续搜索含/great/的行。
如果在ed编辑器内临时需要使用shell命令,可以在命令前加!以表示自己将使用命令而非编辑内容和ed内部命令。如:
bash
!wc 文件名
将会以!结尾的方式返回需要的内容。
bc
-
- 加法
-
- 减法
-
* 乘法
-
/ 除法
-
^ 指数
-
% 余数
quit退出
cal
用法:
cal [选项] [[[日] 月] 年]
选项:
-1, --one 只显示当前月份(默认)
-3, --three 显示上个月、当月和下个月
-s, --sunday 周日作为一周第一天
-m, --monday 周一作为一周第一天
-j, --julian 输出儒略日(显示每一天是本年的第几天)
-y, --year 输出整年
-V, --version 显示版本信息并退出
-h, --help 显示此帮助并退出
date
date 命令用于 显示 或 设置系统的时间或日期。
格式:date [参数] [+[日期格式]]
常用日期格式:
日期格式 | 解释 |
---|---|
%t | 输出制表符,tab键 |
%H | 小时(00~23) |
%I | 小时(00~12) |
%M | 分钟(00~59) |
%S | 秒(00~59) |
%j | 今年中的第几天 |
%Y | 输出年份 |
%m | 输出月份 |
%d | 输出日期 |
fdisk
fdisk
命令可以查看磁盘分区情况和为磁盘进行分区。分区类似于让一个大房子用墙壁按照功能划分为卧室、厕所、厨房、阳台等。
该命令支持的选项有:
选项 说明
-b 扇区大小(512、1024、2048或4096)
-c 兼容模式:"dos"或"nondos"(默认)
-h 打印此帮助文本
-u 显示单位:"cylinders"(柱面)或"sectors"(扇区,默认)
-v 打印版本信息
-C 指定柱面数
-H 指定磁头数
-S 指定每个磁道的扇区数
fdisk -l 查看所有分区情况
help\man
1、help
help命令不带任何参数的话只用于显示内建命令的帮助信息,需要进入到bash中使用(上面有讲过内建命令都在bash源码中)
注意:因此help只能显示内建命令的相关帮助信息显示查询命令的简要说明以及一些参数的使用以及说明,
如果加上--help的参数就可以查看外部命令的帮助信息了
2、man
很常见的一个帮助命令,比help更加详细,而且无内建命令和外部命令之分,man好比一个电子词典,里面多是对命令的详细解释信息,help适合在紧急是忘记用哪个参数的时候用,不太紧急的适合可以用man。
man之前说像一本电子词典,那么就应该有相应的章节如下所见:
章节数 说明
1 Standard commands (标准命令)
2 System calls (系统调用)
3 Library functions (库函数)
4 Special devices (设备说明)
5 File formats (文件格式)
6 Games and toys (游戏和娱乐)
7 Miscellaneous (杂项)
8 Administrative Commands (管理员命令)
9 其他(Linux 特定的), 用来存放内核例行程序的文档。
touch:触碰文件
1.touch一个不存在的文件可以创建该文件。
2.touch一个已经存在的文件可以改变该文件的修改时间。
3.touch -d 可以以指定的方式修改文件的修改时间。
4.touch -t 可以以时间戳的格式修改文件的修改时间。
5.touch -a则表示只修改文件的访问时间。
6.利用touch大量创建文件:如 touch note_{net, db, os}_week{01...16}。该命令会对net,db,os,01...16进行排列组合,共48个文件会被创建。文件名类似于:note_db_week01,note_db_week02,等等。
stat:查看状态
bash
stat xxx
查看该文件的状态
dd:对文件进行数据传输
格式为:dd if=/dev/zero of=文件名 bs=大小 count=个数
/dev/zero会不断产生0数据,然后按照给定的大小,创建若干个相同名字的文件。
除此之外还有其他一些操作:
bash
dd if=/dev/sda of=mbr.bak bs=512 count=1
该命令将sda设备的第一个分区,也就是引导分区,拷贝512个字节到mbr.bak文件中。
这个操作需要有管理员权限。
另外需要注意的是,如果不指定bs大小,必须要确保of文件所在分区大小能够大于if文件的大小。
bash
dd if=/dev/urandom of=/dev/sda
/dev/urandom将随机把数字覆盖/dev/sda中,这个操作就是格式化目标文件。
mkdir:创建目录
bash
mkdir 路径1 路径2 路径3 路径...
将创建若干个目录。
bash
mkdir -p learn/{net, db, os}/note
将依次按照路径创建目录,首先创建learn,然后创建net,最后创建note。
cp:拷贝
bash
cp fly fly2
如果fly2不存在,将会创建一个fly2文件,然后将fly文件拷贝到fly2中。
bash
cp -i fly fly2
如果fly2存在,这个命令系统会询问拷贝时是否要覆盖fly2的内容。
bash
cp -p fly fly3
这个命令将fly文件的内容连同属性也拷贝到fly3中。
bash
cp fly tea doc
当文件名超过3个,则会将前面所有的文件或目录拷贝到最后一个目录中。
bash
cp doc/* bak
这个命令将doc目录的所有文件拷贝到bak中。
bash
cp -p /usr/share/doc/pam-1.1.8/ doc
-p把所有文件内容连同属性拷贝到目标目录中。
bash
cp -f ~/doc /tmp/doc
-f强制将~/doc拷贝到/tmp/doc中,如果/tmp/doc无法打开,则删除并重试。
mv:移动文件
基本格式是:
bash
mv 路径1 路径2
如:mv fly doc/fly4。将fly文件移动到本级目录的doc目录中,更名为fly4。
bash
mv session session01
这个命令将session文件更名为session01。
bas
mv -i session session01
如果目标文件已经存在,-i同样询问是否要覆盖该文件。
bash
mv note_net* learn/net/note
mv note_db* learn/db/note
mv note_os* learn/os/note
星号*表示所有,也就是note_net*表示所有文件名前面为note_net的文件。
bash
mv learn course
移动目录与移动文件没有区别。这个命令将learn目录重命名为course。
rm:删除文件
基本格式是:
bash
$ rm 路径
他会删除路径对应的文件。
bash
$ rm -i doc/fly{2, 4}
-i将会询问是否要删除fly2和fly4两个文件。
bash
$ rm -f doc/fly4
-f将会强制删除文件。
rmdir:删除空目录
现在有三个空目录:
bash
a1/b1/c1 a2/b2/c2 a3/b3/c3
rmdir将删除路径指定的空目录,基本格式:
bash
$ rmdir 路径
如下面的操作将删除a1/b1的空目录c1:
bash
$ rmdir a1/b1/c1
如果路径对应的目录不为空,则报错。
bash
$ rmdir -p a2/b2/c2
如果路径对应的每一层都是空目录,即a2只有b2,b2只有c2,而c2没有文件和目录,则可以用-p删除所有的空目录,即删除a2,b2,c2。
如果要删除含文件的目录,还是要使用rm命令:
bash
$ rm -r a3
将会删除a3目录。
bash
$ rm -rf a3
-rf表示强制删除。
ls:查看文件
bash
$ ls -l 路径
-l可以查看详细信息。在显示的内容中会有类似lrwxrwxrwx的内容,第一个字母是文件的类型。
-,减号表示这是一个普通文件。l表示这是一个符号链接。
b表示这是一个块特殊文件,比如磁盘分区。
c表示这是一个字符特殊文件,比如这是一个终端。
d表示这是一个目录。
p表示这是一个命名管道(FIFO)。
s表示这是一个套接字。
?表示这是一个其他类型文件。
bash
$ ls -i 文件
-i可以查看文件的Inode,关于Inode可以看文件的Inode部分。
bash
$ ls -R a
递归查看a目录下的所有文件、目录,目录的子目录等。
ln:创建链接
Linux的目录实际上是一个文件名列表,内容是文件名+Inode号。Inode号实际上就是一个引用,而文件名+引用就是一个链接。当打开某个文件junk时,会通过这个文件的Inode号,在当前磁盘里的I节点区寻找对应的I节点,然后根据I节点,再找到对应的数据。
一个文件可以有多个链接,比如上图的junk和junk2的Inode号都相同,也就是都指向磁盘中的同一块数据区,因此这个文件有两个链接junk和junk2。
链接分为硬链接和符号链接。
硬链接的Inode号是一样的,指向磁盘中同一个I节点区,而且它们的Inode属性都是一样的,也就是文件大小一样,修改时间一样。
符号链接则是在原有硬链接的基础上新增一个链接,这个链接的Inode号与硬链接不一样。它在磁盘的I节点区新增一个Inode,这个Inode指向与硬链接相同的数据区。
符号链接往往比硬链接的大小要小得多,类似于Windows的快捷方式。同一个文件可以创建多个不同的符号链接,这些符号链接的Inode并不一致,但都指向该磁盘分区的同一块数据区。
bash
$ ln junk junk2
这个命令,将为junk文件创建一个硬链接,于是这个文件有两个硬链接,一个是junk一个是junk2。
创建硬链接有两个限制,第一个限制是不允许跨磁盘分区创建硬链接,第二个限制是不允许为目录创建硬链接。
第一个限制的原因是,在当前磁盘分区内,目录的所有文件的Inode彼此是不同的,然而不同磁盘分区的文件,Inode却是可能相同的,比如A分区某目录有junk文件,Inode号为15274,很容易在B分区某目录中找到一个文件的Inode号与junk一样。因此,创建硬链接时,会导致错误:
bash
$ ln /A/a/junk /B/b/junk2
这个命令是错误的,它企图在B分区的b目录下,创建A分区a目录下junk文件的硬链接。
第二个限制的原因是,Linux系统会通过点号(.或...)文件自主维护目录的硬链接,因此不允许为目录创建硬链接。
通过下面的命令可以创建符号链接:
bash
$ ln -s junk2 junk3
这个命令,将为junk2文件(硬链接)创建一个符号链接junk3。
符号链接依赖其目标文件,当目标文件的硬链接都不再存在,符号链接会失效,当恢复目标文件的硬链接,符号链接就会恢复。
file:查看文件类型
bash
$ file /usr/bin/cat
directory
显示文件类型,如l,d,-,p等。
od:按字节查看文件内容
bash
$ od -bc .bashrc
od命令以八进制或十六进制显示文件的内容。
-bc选项中的c是每个字节打印一个字符,b是每个字节打印其对应的八进制。
bash
$ od -A x -t x1z -v .bashrc
这个命令,-A x表示地址以十六进制的形式显示。-t是内容显示的格式,-t x1z的x表示内容以十六进制的形式显示,1是一个字节,z是显示字符。-v是如果显示的内容某些行完全一样,则完全显示出来而不是使用星号省略。
bash
$ od -A x -t x1z -j 16 -N 16 -v .bashrc
这个命令的-j表示地址跳到第16个字节位置开始显示。-N表示只显示16个字节(一行)的内容。
有一个类似的命令叫做:hexdump
hexdump:按字节查看文件内容
bash
$ hexdump -bc .bashrc
与od不同,hexdump的地址是默认以十六进制的形式显现。-bc作用与od一样,显示一个字节内容对应的八进制和字符。
bash
$ hexdump -C .bashrc
hexdump如果不加-bc选项,则显示内容时默认以十六进制显示,-C就是将每个十六进制内容以字符的方式显示在右边,无法打印的字符用点号显示。
bash
$ hexdump -s 16 -n 32 -C .bashrc
hexdump的-s选项和od的-j选项作用一样,就是跳过16个字节(一行)打印。-n作用与od的-N一样,就是限定显示字节的个数,32表示只显示32个字节,也就是两行。
wc:显示文件的行数,单词数,字符数。
bash
$ wc .bashrc
这个命令将会依次以:行数 单词数 字符数 文件名,显示出来。
mail:给不同用户发送邮件
bash
$ mail 用户名 文件
如:
bash
$ mail tom letter
这时候在tom用户内输入mail,然后选择邮件号,即可查看收到的邮件。
文件的Inode
每个文件都有一个Inode,Inode包含了文件的管理信息,比如修改时间,权限,文件大小,文件位置等。每个文件的Inode号唯一,可以表示文件在磁盘中的位置。
bash
$ ls -i 文件
可以查看文件的Inode号。
文件名通配符
星号*
匹配任意长度的文件名字符串,但不匹配点号.
开头的文件。如*file匹配file
,makefile
,但不匹配.profile
。除非:
bash
$ .*file
星号也可以通配目录名。
这会涉及到显示隐藏文件的方法,下面的语句将会显示所有点号开头的隐藏文件:
bash
$ ls .*
问号?
匹配单个任意字符:
bash
$ ls week?_note
week8_note
方括号[]
匹配单个括号内的任意字符。
bash
$ ls [Ff]ile[abc].txt
Filea.txt Filec.txt fileb.txt
从[Ff]中选择一个字符与后面的ile匹配,同样的取[abc]中任意一个字符与.txt匹配。理想排列组合有2 * 3 == 6中情况,但需要根据实际看是否确实有这个文件。
bash
$ ls a[0-9].log [a-m]01.log
方括号内使用-,可以规定字符范围。
bash
$ ls a[!0-9].log [^a-m]01.doc
方括号前用!和^表示否定的意思,也就是不显示含方括号内指定字符的文件。
大括号扩展{}
组合用法:
bash
$ echo {a,b,c}{d,e,f}
ad ae af bd be bf cd ce cf
注意大括号内的逗号后面不能有空格。
表示a,b,c与d,e,f排列组合,然后执行命令。
bash
$ touch day{1..7}.log
用两个句点.
表示范围,将创建7个文件。
大括号与方括号不同,大括号更倾向于用在创建文件和目录中。方括号在匹配的时候只能匹配到已有的文件,更倾向于查找。
比如:
bash
$ touch month[1-9].log
由于并不存在九个这样的文件,因此方括号无法进行匹配,touch命令就会直接创建名为month[1-9]的log文件。
大括号里句点的用法还可以是:
bash
$ echo a{000..100..10}
a010 a020 a030 a040 a050 a060 a070 a080 a090 a100
第一个..
表示范围,从000到100。第二个..
后面的内容表示步长,表示一次走10个数,因此创建了010,020......100共十个文件。
一个创建目录的用法:
bash
$ mkdir -p a/{b/{c,d},e/{f,g}}
特殊字符与引用
Linux存在一些特殊字符。如~,*,?,#,$,\,`,!,<,>,;,()等。
其中,符号表示将后面变量的值取出来,比如HOME。!表示查找历史命令,!2表示第二个命令。
引用的意思差不多是转义的意思。有时候我们想直接打印这些特殊字符而不是使用这些特殊字符的实际意义。方法有三种:
- 反斜杠("\"):可以对后面的单个特殊字符进行引用(转义)。
- 双引号(弱引用):引用除$ \ ` !之外的特殊字符。
- 单引号(强引用):引用所有特殊字符。
IO重定向
标准文件描述符
每个shell命令都从shell继承了三个标准文件描述符:
0:标准输入文件(stdin)
1:标准输出文件(stdout)
2:标准错误文件(stderr)
默认情况下,三个标准文件描述符都连接终端。
标准输入重定向<
bash
$ cat
Hello Linux!
Hello Linux!
cat命令不加文件名,默认从终端获取数据,也就是从用户输入到终端的内容获取。
bash
$ cat <fly
xxxxxxxx
xxxxxxx
xxxxxx
xxxxx
xxxx
xxx
xx
x
小于号<表示输入重定向。这个命令,bash会打开fly文件,然后将cat的输入重定向到fly文件,cat命令从fly文件读取数据,然后执行cat命令。
这个过程可以从wc命令中理解:
bash
$ wc <students.db
10 50 190
$ wc students.db
10 50 190 students.db
第一个命令,bash首先打开students.db,然后将wc命令的stdin重定向到students.db,wc只获取了students.db的数据,并不知道有students.db这个文件。
第二个命令,由wc命令亲自打开students.db文件,然后执行wc命令,所以后面会有文件名。
标准输出重定向>
bash
$ ls >ls.out
$ cat ls.out
file1.txt file2.txt file3.txt
大于号>将shell命令的输出重定向到指定文件。
假如用户打开了两个本地虚拟终端,pts/0,pts/1。我们可以在pts/0终端输入:
bash
$ echo hello world >/dev/pts/1
这意味着将echo命令的输出重定向到/dev/pts/1终端屏幕,然后执行echo hello world,输出在/dev/pts/1终端屏幕中出现。
bash
$ cat file1
this is file1
$ cat file2
this is file2
$ cat file{1,2} >allfile
$ cat allfile
this is file1
this is file2
这是一个拷贝的操作。首先bash检查输出重定向目标文件是否存在,如果存在,由于是单个输出重定向符号>,因此将删除目标文件的内容,如果不存在,将创建该文件。然后将cat命令输出重定向到allfile,cat执行命令,查看file1与file2两个文件的内容,然后将查看的内容输出到allfile而不是终端屏幕中。
这里涉及到覆盖式输出重定向>,它将删除目标文件的内容。追加式输出重定向>>,它则在目标文件的末尾追加内容。
关于输入重定向和输出重定向的组合用法
bash
$ cat <file1 >file4
$ cat file1
this is file1
$ cat file4
this is file1
这有点类似于拷贝。
bash
$ cat >hellolinux
linux is a good os.
we should learn linux.
good luck.
$ cat hellolinux
linux is a good os.
we should learn linux.
good luck.
没有为输入重定向,因此从键盘所输入的内容执行cat,然后将输出结果重定向到hellolinux文件中。
来看下面有意思的例子:
bash
$ wc temp
5 23 240 temp
$ wc temp >temp
0 0 0 temp
为什么有这样的结果?首先bash将wc输出重定向为temp文件,在此过程中,发现temp文件以存在,由于不是追加式输出重定向>>,因此删除temp中的内容,然后执行wc temp。没有内容,自然是0 0 0 temp。
标准错误重定向2>
假如.profile
是一个不存在的文件:
bash
$ ls .bashrc .profile >ls.out
ls: cannnot access .profile: No such file or directory
$ cat ls.out
.bashrc
命令企图将两个文件的信息输出重定向到ls.out
文件,然而.profile
文件不存在,因此将报错内容输出到终端屏幕,而存在的文件.bashrc
的信息被正常输出到ls.out
。
可以指定报错输出的位置,也就是进行shell命令的错误重定向。
is is file1
$ cat file4
this is file1
这有点类似于拷贝。
```bash
$ cat >hellolinux
linux is a good os.
we should learn linux.
good luck.
$ cat hellolinux
linux is a good os.
we should learn linux.
good luck.
没有为输入重定向,因此从键盘所输入的内容执行cat,然后将输出结果重定向到hellolinux文件中。
来看下面有意思的例子:
bash
$ wc temp
5 23 240 temp
$ wc temp >temp
0 0 0 temp
为什么有这样的结果?首先bash将wc输出重定向为temp文件,在此过程中,发现temp文件以存在,由于不是追加式输出重定向>>,因此删除temp中的内容,然后执行wc temp。没有内容,自然是0 0 0 temp。
标准错误重定向2>
假如.profile
是一个不存在的文件:
bash
$ ls .bashrc .profile >ls.out
ls: cannnot access .profile: No such file or directory
$ cat ls.out
.bashrc
命令企图将两个文件的信息输出重定向到ls.out
文件,然而.profile
文件不存在,因此将报错内容输出到终端屏幕,而存在的文件.bashrc
的信息被正常输出到ls.out
。
可以指定报错输出的位置,也就是进行shell命令的错误重定向。