Linux基础指令2

Linux基础指令2

前言

本篇是Linux基础指令1的后续内容,介绍的其他基础指令请参见上一篇分享;本篇同样介绍一些初期学习需要了解的基础指令,以及一些Linux系统学习过程中需要补充的概念或知识点

本篇专栏:Linux

作者主页:海盗猫鸥-CSDN

基础指令

mv

mv即move,可以用来移动文件或者文件重命名

使用格式为mv src(源文件/目录) dst(目标文件/目录)

  1. 若目标文件存在,那么源文件将被移动到目标文件(目录)中
  2. 若目标文件不存在,那么就会将源文件重命名成目标文件

cat tac

打印源文件中的所有内容到目标文件,直接单独使用时,将从键盘里读取内容后打印

(默认将源文件内容打印到本终端文件中,即显示在使用的终端窗口里)

命令行选项-n可以显示行数

tac则是将内容倒着打印出来

echo

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

默打印到终端文件,可以使用重定向指定位置(如图打印到文件中)

more

为了便于演示,我们使用/var/log/messages日志文档

我们使用cat查看文件内容时,cat指令会一次性显示出所有的文件内容,这有时可能并不是我们想要的,所以我们还有几个可以用于查看文件文件内容的:morelessheadtail

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

  1. 分别使用headtail打印(默认打印十行内容)
  2. 指定行数打印
  3. 打印中间指定行数的文件内容,比如我们打印[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为例:

  1. 使用find的目录下没有.c结尾的文件时 ,shell在本目录下没有找到.c文件,所以通配符没有被展开,传递给find命令的指令就依然是find ~ -name *.c,所以find就可以在家目录下查找到所有符合.c结尾的文件;
  2. 使用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 参数使用了通配符,必须用引号括起来,否则:

  1. 当前目录无匹配文件时,通配符保持原样,命令可能正常工作
  2. 当前目录有匹配文件 时,通配符可能被展开为多个文件名,导致 find 语法错误

这是因为 find -name 只能接受单个模式参数,而shell展开可能产生多个参数。

grep

行文本过滤工具,会将含有指定关键字的行保留下来

使用场景及示例:

  1. 查看某种包含特定字符串的文本行,如在日志文件总排查错误信息等;
    code1(C语言可执行程序)打印出1到100放入到log.txt文件中,grep指令筛选出log.txt中含有字符9的行

  2. 查找进程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选项必须放在指定的路径之前),默认解压位置为使用指令的目录下。
zipunzip都可以使用相对或者绝对路径来指定要操作的文件。

zip 压缩包名 源文件/源文件路径 (-r)
unzip 压缩包名 (-d) 解压位置(路径)想指定路径解压就必须使用-d

Linux和Windows互传压缩包

使用命令sz rz;安装yum(apt) install -y lrzsz

sz发送


rz接收


需要注意,szrz指令都是在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输出到终端中。

此处先给出三种重定向操作

  1. 输出重定向>
    将指定内容重定向到目标文件中:
  • 目标文件不存在 ,那么就会新建一个文件
  • 目标文件存在 ,就会清空文件 后,从头开始写入
  1. cat test1.txt命令的效果,原本是将test1.txt的内容打印到终端上,通过重定向,将打印结果放入到test2.txt文件中
  2. 直接重定向已经存在的文件,由于重定向之前没有任何指令,所以相当于将空结果放入 test2.txt,就相当于将文件清空了
  3. 直接重定位不存在的文件,就会创建一个空的普通文件,需要注意的是这种创建新文件的方式只能创建普通文件
  1. 输出追加重定向>>

    >不同的点在于,>>会从从文件末尾追加写入,不会覆盖掉之前的内容,文件不存在时也会新建。

  2. 输入重定向<

    此处可以发现,直接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的基础指令我们就介绍到这里,有不足或者有误的地方欢迎大家补充纠正。我们下篇再见~

相关推荐
小义_2 小时前
【RH134知识点问答题】第11章 管理网络安全
linux·安全·web安全·云原生
nnbulls12 小时前
Linux环境下Tomcat的安装与配置详细指南
linux·运维·tomcat
unirst19850072 小时前
Mysql官网下载Windows、Linux各个版本
linux·数据库·mysql
嵌入小生0072 小时前
线程 --- 嵌入式(Linux)
linux·vscode·vim·嵌入式·线程·进程
wsad05322 小时前
Linux Shell脚本执行方式全解析:source、点号、路径、bash与exec的区别
linux·运维·bash·shell
Whoami!2 小时前
⓬⁄₅ ⟦ OSCP ⬖ 研记 ⟧ Linux权限提升 ➱ 寻觅暴露的机密信息实现提权
linux·网络安全·信息安全·权限提升
济6172 小时前
ARM Linux 驱动开发篇--嵌入式 Linux LED 驱动开发实验(2)--Linux 下 LED 灯驱动开发代码编写-- Ubuntu20.04
linux·arm开发·驱动开发
草莓熊Lotso2 小时前
Linux 磁盘基础:从物理结构到 CHS/LBA 寻址,吃透数据存储底层逻辑
linux·运维·服务器·c++·人工智能
你怎么知道我是队长2 小时前
C语言---排序算法11---桶排序法
c语言·开发语言·排序算法