Linux笔记

Linux

文章目录

命令

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匹配filemakefile,但不匹配.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命令的错误重定向。

相关推荐
学习向前冲3 分钟前
安装一键式重置密码插件(Linux)-CloudResetPwdAgent
linux·运维·服务器
石兴稳33 分钟前
Ceph client 写入osd 数据的两种方式librbd 和kernel rbd
linux·ceph
不会编程的懒洋洋1 小时前
Spring Cloud Eureka 服务注册与发现
java·笔记·后端·学习·spring·spring cloud·eureka
垂杨有暮鸦⊙_⊙2 小时前
阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势
笔记·学习·无人机
大G哥2 小时前
python 数据类型----可变数据类型
linux·服务器·开发语言·前端·python
BillKu2 小时前
Linux设置Nginx开机启动
linux·运维·nginx
Xiao Fei Xiangζั͡ޓއއ2 小时前
一觉睡醒,全世界计算机水平下降100倍,而我却精通C语言——scanf函数
c语言·开发语言·笔记·程序人生·面试·蓝桥杯·学习方法
baidu_375528813 小时前
光感传感器 芯片stk3171 linux驱动程序
linux·运维·服务器
baijin_cha3 小时前
机器学习基础04_朴素贝叶斯分类&决策树分类
笔记·决策树·机器学习·分类
飞腾开发者3 小时前
飞腾平台Arm NN软件栈安装使用指南
linux·运维·人工智能·机器学习·计算机视觉