Linux基础指令2
前言
本篇是Linux基础指令1的后续内容,介绍的其他基础指令请参见上一篇分享;本篇同样介绍一些初期学习需要了解的基础指令,以及一些Linux系统学习过程中需要补充的概念或知识点
本篇专栏:Linux
作者主页:海盗猫鸥-CSDN
基础指令
mv
mv即move,可以用来移动文件或者文件重命名
使用格式为mv src(源文件/目录) dst(目标文件/目录)
- 若目标文件存在,那么源文件将被移动到目标文件(目录)中
- 若目标文件不存在,那么就会将源文件重命名成目标文件
cat tac
打印源文件中的所有内容到目标文件,直接单独使用时,将从键盘里读取内容后打印
(默认将源文件内容打印到本终端文件中,即显示在使用的终端窗口里)

命令行选项-n可以显示行数
而tac则是将内容倒着打印出来

echo
将后续内容视为字符串写入到目标文件(一样默认为使用指令的终端文件)中。并且自带一个换行符

默打印到终端文件,可以使用重定向指定位置(如图打印到文件中)
more
为了便于演示,我们使用/var/log/messages日志文档
我们使用cat查看文件内容时,cat指令会一次性显示出所有的文件内容,这有时可能并不是我们想要的,所以我们还有几个可以用于查看文件文件内容的:more、less、head、tail
more会显示一整页的文件内容:
more /var/log/messages

按q退出,Enter继续往下显示,/查找(/后输入要查询的字符串),more指令不支持往上回翻,只能一直向下翻看后续内容
less
less /var/log/messages

与more不同的是,less支持使用上下键来查看内容,退出和查找使用方法一样
head / tail
head是从头开始打印出文件的每一行内容,默认为10行
可以使用-n(n为数字)命令行选项指定行数;tail则是从后往前打印每一行的内容
我们写一个C语言循环来创建一个1到100行的文件:
c
//test_tac.c
#include <stdio.h>
int main()
{
int cnt = 1;
while(cnt <= 100)
{
printf("hello Linux (?w?) %d\n", cnt++);
}
return 0;
}
gcc编译出可执行文件:gcc test_tac.c -o test_tac
将可执行文件的输出内容重定向到test1.txt中./test_tac > log.txt
- 分别使用
head和tail打印(默认打印十行内容)

- 指定行数打印

- 打印中间指定行数的文件内容,比如我们打印[41, 60]行的内容:
先使用
head -60 log.txt > tmp.txt将前60行放入一个文件中,再使用tail -20 tmp.txt打印后20行内容;
(这里不做演示,和上文中逻辑类似,下文演示结合管道|的使用方法)
使用管道|实现:
管道会将上一个指令的结果交给下一条指令来操作
head -60 log.txt | tail -20
指令解释:|会将前面指令head的结果传递到后面的指令tail中,使其作为tail的"操作目标"

cat log.txt | head -60 | tail -20
下图中最后指令wc意为单词统计(word count),命令行参数-l表示line,即按行统计

date
用于查看时间信息
1.显示格式,可通过+添加格式:
%Y:年
%m:月
%d:日
%H:时
%M:分
%S:秒
%X:相当于 %H:%M:%S
%F:相当于 %Y-%m-%d
此处下划线是我用来隔开%F和%X的符号,可自定义(不能使用空格)
2.时间戳(格林威治时间)
概念:Unix时间戳(英⽂为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1⽉1⽇(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒
date +%s可查看时间戳
date 格式 -d @时间戳可转化时间戳为指定格式的时间信息

whereis find
find 目录 -name 文件名例子:find / -name ls
find会在指定目录中去查找指定文件名的文件,然后打印出路径。目前只了解这一种用法即可
错误操作及解决方案
当我使用find命令使用通配符查找文件时,出现查找失败的情况,与预期结果不符:
1 . 在含有.c文件的目录下查找*.c,查找失败

2 . 在不含有.c文件的目录下查找*.c,查找成功
3 .再回到含有.c文件的目录下查找"*.c"(加双引号),查找成功
错误原因 :
主要问题集中在通配符*的展开上,以上述*.c为例:
- 使用find的目录下没有
.c结尾的文件时 ,shell在本目录下没有找到.c文件,所以通配符没有被展开,传递给find命令的指令就依然是find ~ -name *.c,所以find就可以在家目录下查找到所有符合.c结尾的文件; - 使用find的目录下含有.c结尾的文件时 ,由于shell会先于find命令将通配符展开,此时shell就会将
*.c转换成test_tac.cd redir.c等多个文件名,此时find命令变为了find ~ -name test_tac.c redir.c,但又由于-name后只能有一个参数(模式参数),由此导致find查找失败。
补充(AI)shell的通配符展开机制:
在执行命令前,Shell 会先扫描当前目录,将通配符(如 *.c)展开为匹配的文件名列表。如果 find 命令的 -name 参数使用了通配符,必须用引号括起来,否则:
- 当前目录无匹配文件时,通配符保持原样,命令可能正常工作
- 当前目录有匹配文件 时,通配符可能被展开为多个文件名,导致
find语法错误
这是因为 find -name 只能接受单个模式参数,而shell展开可能产生多个参数。
grep
行文本过滤工具,会将含有指定关键字的行保留下来
使用场景及示例:
-
查看某种包含特定字符串的文本行,如在日志文件总排查错误信息等;
code1(C语言可执行程序)打印出1到100放入到log.txt文件中,grep指令筛选出log.txt中含有字符9的行
-
查找进程
px ajx可以查到系统当中所有启动的进程,再使用管道 和grep筛选出我们想找的进程
grep命令行选项:
-n:显示过滤出来的行,在原来文件中的行号
-v:(reverse)取反,只要不包含指定字符串的都显示出来(排除掉)
上述示例中,我们在log.txt中随机修改几个hello,然后取反查找hello字符串;
-i:(ignore)忽略大小写
1.区分大小写:-v选项没有将诸如"HELLO"、"hEllo"等含有大写字母的字符串视为"hello",所以-v选现在排除"hello"时没有排除它们;
2.不区分大小写:-i选项使grep命令过滤时不区分大小写,所以此时-v选项将含有大写字母的"HELLO"等字符串也视为"hello",所以对应行被排除掉。
zip/unzip
zip --version查看版本;yum(apt) install -y zip unzip安装命令
-r选项递归打包压缩目录(普通文件可以不用),
-d解压到指定目录(-d选项必须放在指定的路径之前),默认解压位置为使用指令的目录下。
zip和unzip都可以使用相对或者绝对路径来指定要操作的文件。
zip 压缩包名 源文件/源文件路径 (-r)
unzip 压缩包名 (-d) 解压位置(路径)想指定路径解压就必须使用-d
Linux和Windows互传压缩包
使用命令sz rz;安装yum(apt) install -y lrzsz
sz发送


rz接收


需要注意,sz和rz指令都是在Linux下执行的指令,且必须保证你的Linux机器处于联网状态,可以使用ping -c3 baidu.com来验证机器是否联网:

tar
创建压缩包tar (-)czf 压缩包名.tgz(.tar.gz) 源文件或目录,不需要-r递归选项就能直接打包目录

解压压缩包tar (-)xzf 压缩包名.tgz(.tar.gz)
-C解压到指定路径,默认为解压位置为当前所在目录

-v显示打包压缩和解压的过程

关于tar的选项这里不做详解,只需要知道-czf是打包压缩,-xzf是解压缩即可
bc
简单的计算器

uname
查看体系结构和系统内核版本
-a:查看详细信息

-r:只查看内核版本和体系结构
history
可以显示出近期使用过的指令
shutdown
-h:将系统的服务停掉后,立即关机。
-r:在将系统的服务停掉之后就重新启动
-t sec:-t 后⾯加秒数,亦即『过几秒后关机』的意思
相关知识点
在Linux系统中,一切皆为文件
(暂时只做粗略理解)
不论是我们自己创建的文件,还是各种输入输出设备(键盘、鼠标等),在Linux中都被视为一个文件,也就是说我们的所有操作,都可以被视为一种文件操作。
而我们最常见的文件,毫无疑问就是我们自己创建的各种文件,除此之外,我们可以想到的是,输入输出肯定是文件操作最重要的部分。也就是说,系统必须打开有关输入输出的文件,我们的所有操作才会成立;而系统中确实就是会默认打开三个文件:键盘(输入)、显示器(输出)、显示器(输出)。(此处为抽象表达)
而在c/cpp中我们使用过printf/scanf/cout/cin等输入输出方式,那么这些是否也可以看为一种文件操作呢?答案当然是肯定的:
我们知道,在c语言的文件操作 中,我们要使用到fopen函数来打开一个文件,然后再对其进行一系列的读写操作,最后用fclose关闭文件;而我们在使用上述的几个输入输出函数时,为什么没有进行文件的打开关闭文件的操作就能直接进行读写了呢?这是因为编译器会帮我们自动打开几个文件:
这些文件就分别对应了标准输入流(stdio)、标准输出流(stdout)、标准错误输出流(stderr)。也就对应了上文中提到的默认打开的三个文件;
所以我们在写代码时的输入输出函数可以直接进行读写操作,而不用打开什么文件。这是因为默认就帮我们打开了。
结合下文重定向操作和终端文件示例中的cat/echo等指令的使用:这些指令能直接对设备文件进行操作就足够说明,Linux中一切皆文件!
重定向操作
我们知道,Linux中一切都是文件,所以当我们使用cat/echo等指令进行终端中的打印时,实际上就是通过这些指令,让一些内容写入到了终端 这个文件里;也就是说除了默认的文件,我们也可以指定文件来进行cat/echo等操作:
观察上述操作可以看出,我们使用echo将本来要写入到终端这个文件中的一串字符串,通过重定向操作将其写入到了test1.txt文件中,然后再使用cat输出到终端中。
此处先给出三种重定向操作:
- 输出重定向
>
将指定内容重定向到目标文件中:
- 若目标文件不存在 ,那么就会新建一个文件
- 若目标文件存在 ,就会清空文件 后,从头开始写入

cat test1.txt命令的效果,原本是将test1.txt的内容打印到终端上,通过重定向,将打印结果放入到test2.txt文件中- 直接重定向已经存在的文件,由于重定向之前没有任何指令,所以相当于将空结果放入
test2.txt,就相当于将文件清空了- 直接重定位不存在的文件,就会创建一个空的普通文件,需要注意的是这种创建新文件的方式只能创建普通文件
-
输出追加重定向
>>与
>不同的点在于,>>会从从文件末尾追加写入,不会覆盖掉之前的内容,文件不存在时也会新建。

-
输入重定向
<

此处可以发现,直接
cat test1.txt和使用输出重定向cat < test1.txt的结果相同,但这两种用法的原理不同,随着以后学习的深入我们便会了解。
我们执行man fopen命令,查看文档可以看到:

C语言中我们就知道,文件有多种打开方式;所有我们的输出重定向 >就相当于用w的方式打开文件,而追加重定向 >>就相当于用a的方式打开文件.
终端文件
上述重定向操作中,我们提到终端也是一种文件,事实是否如此呢?如何验证?
使用命令ll /dev/pts(tty指令可以直接查看当前终端窗口对应的文件名)会得到如下结果:

我们此时再打开另外一个终端窗口:

我们发现增加了一个文件名为1的新文件,以文件属性以c开头,是一种字符文件;
此时我们进行一系列重定向操作:
1.将ll的结果重定向到/dev/pts/1中:
2.重定向内容到其他终端文件:

由此我们可以看出文件0就是我们打开的第一个终端,文件1就是我们打开的第二个终端。而我们所使用的命令就是文件操作,终端也就是一个文件!
C语言代码样例:
编译指令:gcc redir.c -o redir,然后使用./redir来运行
cpp
//redir.c
#include <stdio.h>
const char *dev="/dev/pts/0"; //指定终端文件
int main()
{
//打开终端0的文件
int cnt = 10;
FILE *fp = fopen(dev, "w");
if(fp == NULL){
printf("open %s error!\n", dev);
return 1;
}
//在指定终端文件中输出内容
while(cnt--)
{
fprintf(fp, "hello Linux, hello %d\n", cnt);
sleep(1);
}
//关闭文件
fclose(fp);
return 0;
}
这段代码的输出内容就被定位到了终端0中,若此时终端0不存在,就会文件打开失败。
Linux文件分类
Linux下不以文件后缀区分文件类型,而是前缀 ,但不代表禁止使用后缀 ,诸如编译器编译文件的时候,就要使用到后缀,只有正确的后缀才能编译成功。Linux系统不用,不代表其他工具就不会用
-:普通文件;
d:目录文件;
c:字符文件,如键盘、显示器、终端等,输入的数据具有顺序性;
b:块设备文件,磁盘;

I:链接文件,window下的快捷方式就是一种链接文件

p:管道文件,与进程间通信有关,以后会学习,此处只做了解

后记
感谢大家阅读本篇博客,Linux的基础指令我们就介绍到这里,有不足或者有误的地方欢迎大家补充纠正。我们下篇再见~

