【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(文件处理指令-上)

背景前言

在当今的数字化时代,Linux已成为服务器、云计算、物联网等众多领域的核心操作系统。对于技术从业者、开发者以及系统管理员来说,掌握Linux指令不仅是一项基本技能,更是打开专业领域大门的关键。

学习Linux指令的必要性:

  • 行业标准与需求: 在IT行业,Linux技能已被广泛认可为必备能力。无论是求职还是项目实施,具备Linux知识都是一项重要的竞争优势。
  • 高效操作与维护: 通过掌握Linux指令,用户可以更快速、高效地完成日常的系统管理、配置更改、故障排除等任务,提高工作效率。
  • 系统安全性: 了解Linux指令有助于增强对系统安全的理解,从而更好地配置安全策略、防范潜在威胁和维护系统安全。
  • 自动化与脚本编写: Linux指令为自动化工作流提供了强大支持,通过脚本编写,可以实现任务的批量化、自动化执行,减少重复劳动。

专栏介绍

在这个专栏《【Linux技术专题】「夯实基本功系列」XXXXX》中,我们将一同深入Linux指令的海洋,无论您是初次涉足还是已熟悉操作,都能从中获得宝贵的经验和知识。这里汇集了详尽的教程、实用的指南和高级技巧,旨在助您深化对Linux指令的理解并掌握其运用。

面向对象

以下是建议学习Linux指令面向的人群和对象:

  1. 运维人员OM:系统管理员是直接负责维护Linux系统正常运行的专业人员。他们需要熟练掌握各种Linux指令,以完成日常的系统管理、配置更改、故障排除等任务。
  2. 后端开发者:Java、Python以及其他的后端语言开发人员,Linux是后端服务器的主要操作系统,开发的应用程序,都需要在Linux服务器上部署和运行。掌握Linux指令可以帮助开发人员更好地管理服务器,配置环境,以及解决部署和运行过程中可能遇到的问题。
  3. DBA/数据库开发人员:数据库管理员使用Linux作为数据库服务器的操作系统。他们需要了解如何安装、配置和管理关系型数据库管理系统(如MySQL、PostgreSQL)以及其他相关的数据库软件。
  4. 云计算工程师:云计算工程师使用Linux来构建和管理云计算平台。他们需要了解如何部署和管理虚拟化技术、容器化工具(如Docker)以及云原生技术等。
  5. 其他相关人员:对于计算机科学和相关专业的学生,学习Linux指令是课程学习的必备内容。对于Linux感兴趣的爱好者,通过自学和实践,可以深入了解Linux操作系统的工作原理和实现方式。

重点内容

本章节我们主要去学习和研究实践Linux操作系统中的【文件处理命令】,主要面向于操作文件以及处理查询文件内容等常用的指令,如果没有涵盖的指令,还希望您可以多多给我留言和评论,后面我会继续完善和补充,谢谢。

文件处理命令

Linux系统的信息都储存在文件中,这些文件与常见的办公文件颇为相似。每个文件都有自己的标识,如名字、内容、存放位置,以及一些管理信息,例如文件的拥有者、大小等。这些文件可以是信件、通讯录,或者是程序的源代码、数据,甚至是可执行的程序或非文本内容。

Linux的文件系统组织严密,为文件处理提供了大量的工具。本文主要探讨了一些常用的文件处理命令。

file

通过对文件内容的探测,file功能能够准确地识别出文件类型。而为了让所有用户都能享受到这个功能带来的便利,特此赋予了所有用户的使用权限。

格式

shell 复制代码
file [options] 文件名
[options] 主要参数
  • -V:在标准输出后显示版本信息,并且退出。
  • -z:探测压缩过的文件类型。
  • -L:允许符合连接。
  • -f name:从文件namefile中读取要分析的文件名列表。
简单说明

通过使用file命令,我们可以轻松识别出特定文件的类型。无论是ELF格式的二进制可执行文件、Shell脚本文件,还是其他任何格式,file命令都能准确地给出答案。它还能识别目录、英文文本、C语言源文件、文本文件以及DOS的可执行文件等。

使用案例

如果我们看到一个文件handle.sh,可以使用下面命令:

shell 复制代码
$ file  handle.sh 
handle.sh: Bourne-Again shell script, ASCII text executable

在系统显示这是一个英文文本文件的同时,我们也必须明确一点:file命令在探测多媒体文件类型,如图形、音频和视频等时,是存在局限性的。

mkdir

mkdir命令的功能是创建名为dirname的子目录,与MS DOS中的md命令相似。为了让所有用户都能方便地使用这个命令,我们赋予了它对所有用户的开放权限。

格式

shell 复制代码
mkdir [options] 目录名
[options] 主要参数
  • -m--mode=模式:设定权限<模式>,与chmod类似。
  • -p--parents:需要时创建上层目录,如果目录早已存在,则不当作错误。
  • -v--verbose:每次创建新目录都显示信息。
  • --version:显示版本信息后离开。
应用实例

在创建目录并设置权限时,可以使用"-m"参数。例如,要创建一个名为"tsk"的目录,并为所有用户赋予读、写和执行权限,您可以使用以下命令:

shell 复制代码
@$mkdir -m 777 tsk

grep

grep命令允许您在文件中搜索特定内容,并将包含这些内容的行显示在标准输出中。全称为Global Regular Expression Print的grep命令,它被赋予了对所有用户的开放权限。

格式

shell 复制代码
grep  [options] <pattern> <files>

主要参数

[optionsl 主要参数
  • -C:仅显示匹配行的总数。
  • -I:忽略大小写匹配(仅限单个字符)。
  • -h:在检索多个文件时,不显示文件名。
  • -l:在查询多文件时,仅输出那些包含匹配字符串的文件名。
  • -n:显示每个匹配行及其对应的行号。
  • -s:不显示关于不存在文件或者没有找到匹配文本的错误信息。
  • -v:输出不含匹配文本的所有行。

应用实例

shell 复制代码
$ grep -C 20 ps  handle.sh 
#!/bin/bash
pids=$(ps -ef | awk '{print $2}')
for pid in $pids
do
    echo "PID: $pid"
    lsof -p $pid | wc -l
done
pattern正则表达式主要参数

正则表达式是Linux/Unix系统中一个强大的工具,用于定义能够匹配一系列符合特定规则字符串的模式。正则表达式提供了一种更为灵活和强大的方式来描述和识别字符串模式。当一个字符串的结构符合某个正则表达式定义的模式时,我们称之为与该正则表达式"匹配"。

  • \:忽略正则表达式中特殊字符的原有含义。
  • ^:匹配正则表达式的开始行。
  • $:匹配正则表达式的结束行。
  • <:从匹配正则表达式的行开始。
  • >:到匹配正则表达式的行结束。
  • []:单个字符,如[A]即A符合要求。
  • [-]:范围,如[A-Z],即A、B、C一直到Z都符合要求。

在Linux系统中,正则表达式广泛应用于文本搜索、执行复杂的搜索替换操作,以及执行各种文本处理任务。通过掌握正则表达式,用户可以有效地管理和处理文本数据,提高工作效率。

应用实例

查询DNS服务是日常工作之一,这意味着要维护覆盖不同网络的大量P地址。有时IP地址会超过2000个。如果要查看nnn.nnn网络地址,但是却忘了第二部分中的其余部分,只知到有两个句点,例如nnn nn.:,

要抽取其中所有nnn.nnn IP地址,使用[0-9]{3}\.[0-9]{3}\.含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点。

这将匹配以三位数字开头,接着是一个点,然后是一到三位数字,再接着是一个点的字符串。如果您想要确保这是开始或结束的一部分,可以在两边添加边界匹配符 ^$

fgrep和egrep

grep家族中不仅包括标准的grep工具,还有fgrep和egrep这两种变体。

  • fgrep,也称为fixed grep,主要用于查找固定字符串,而不是使用模式匹配。这使得fgrep在执行字符串精确匹配时更为高效。

  • egrep,即扩展grep,支持基本和扩展的正则表达式。它提供了更丰富的模式匹配功能,但不支持某些特定的模式范围应用,例如"q模式"。这些变体使得grep工具在不同的搜索场景中更加灵活和强大。

dd

dd命令用来复制文件,并根据参数将数据转换和格式化。

格式

shell 复制代码
dd [options]
[options]主要参数

当然可以。以下是润色和优化后的内容:

  • count=块数目:仅复制指定数量(<块数目>)的数据块。
  • bs=字节:设置每次读取操作的数据大小为指定的字节数(<字节>)。
  • if=文件:从指定的文件(<文件>)读取数据,而不是从标准输入。
  • obs=字节:设置每次写入操作的数据大小为指定的字节数(<字节>)。
  • of=文件:将数据写入指定的文件(<文件>),而不是输出到标准输出。
  • seek=块数目:在写入之前,跳过指定数量(<块数目>)的数据块,以obs为单位。
  • skip=块数目:在读取之前,跳过指定数量(<块数目>)的数据块,以ibs为单位。

应用实例

dd命令是在Linux中常用于创建启动盘的一个强大工具。先找一个可引导内核,令它的根设备指向正确的根分区,然后使用dd命令将其写入软盘:

shell 复制代码
rdev vmlinuz /dev/hda
$dd if vmlinuz of =/dev/fdo

上面代码说明,使用rdev命令将可引导内核vmlinuz中的根设备指向/dev/hda,请把"hda"换成自己的根分区,接下来用dd命令将该内核写入软盘。

find

fnd命令的作用是在目录中搜索文件,它的使用权限是所有用户。

格式

shell 复制代码
find [path] [options] [expression]

path 参数用于指定开始搜索文件的起始目录路径。系统将从这个路径开始,沿着目录结构向下逐层查找匹配的文件。该参数接受一个由空格分隔的目录路径列表。若省略 path 参数,则搜索默认从当前工作目录开始。

主要参数

[options]参数
  • depth: 采用深度优先的方式进行搜索,在达到指定深度级别的目录中优先搜索文件。
  • maxdepth levels: 限制搜索深度至起始目录下的第 levels 层子目录。levels 是一个非负整数。当 levels 设置为 0 时,仅在当前目录进行搜索。
  • mindepth levels: 设置搜索的最小深度,意味着搜索操作会忽略起始目录下至第 levels 层子目录之前的所有层级。
  • mount: 指示搜索时跳过挂载的其他文件系统(例如 MsdosVfat 等)中的目录和文件。
  • version: 输出当前使用的软件版本信息。
[expression]是匹配表达式

[expression] 为匹配表达式,作为 find 命令所接受的参数,对其进行操作。find 命令提供了众多选项和参数,以下仅列举了几个常用的参数以供参考:

  • name: 支持使用通配符 * 和问号 ? 进行文件名匹配。
  • atime n: 查找在过去 n 天内被访问过的文件。
  • ctime n: 查找在过去 n 天内内容被修改过的文件。
  • group groupname: 查找文件组属性为 groupname 的所有文件。
应用技巧
根据文件名查找

例如,我们想要查找一个文件名是a.conf的文件,可以使用如下命令:

shell 复制代码
find / -name a.conf

find命令后的"/"表示搜索整个硬盘。

快速查找文件

在根据文件名进行查找时,尤其是在大型Linux文件系统或高容量硬盘中,文件若位于深层次的子目录中,搜索过程可能会耗费大量时间。如果我们已经知道目标文件位于某个特定目录下,那么将搜索范围限制在该目录及其子目录中,可以显著提高查找效率并节省时间。

当搜索特定类型的文件如配置文件时,可以根据文件后缀名来缩小搜索范围,节省大量时间。例如,对于以".conf"结尾的文件,如smb.conf,我们可以推断它是一个配置文件,通常这类文件会位于/etc目录下。因此,在这种情况下,我们可以使用以下命令进行高效搜索:

shell 复制代码
find  /etc -name smb.conf
根据部分文件名查找方法

在我们已知某个文件包含特定字符序列"abvd"时,为了定位系统中所有含有这一字符序列的文件,我们可以执行以下命令进行精确搜索:

shell 复制代码
find / -name '*abvd*'

执行此命令后,Linux系统将从根目录/开始,扫描所有文件名中包含"abvd"这四个连续字符的文件。在这里," * " 作为通配符,允许在"abvd"前后存在任意字符。因此,不仅仅是精确匹配"abvd"的文件名,像"abvdrmyz"这样的文件名,只要符合包含"abvd"这一条件的文件都将被检索并显示出来。

使用混台查找方式查找文件

若需在/etc目录中寻找那些文件大小超过500000字节且在过去24小时内有过修改的文件,我们可以使用find命令的逻辑"与"操作来结合两个搜索条件,构造一个复合查询。这样的查询会同时满足这两个条件,筛选出符合所有指定属性的文件。

shell 复制代码
find /etc -size +500000c -and -mtime +1

总结

总之,学习Linux指令对于在技术领域工作或对技术感兴趣的人群来说都是非常有价值的。无论您是专业人士还是爱好者,通过学习和实践,您都可以获得更深入的理解和技术能力。

未完待续

等待下一篇对于剩下的指令的介绍和说明:

相关推荐
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
舞动CPU4 小时前
linux c/c++最高效的计时方法
linux·运维·服务器
杜杜的man4 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang
java小吕布5 小时前
Java中Properties的使用详解
java·开发语言·后端
秦jh_6 小时前
【Linux】多线程(概念,控制)
linux·运维·前端
2401_857610036 小时前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
keep__go7 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
矛取矛求7 小时前
Linux中给普通账户一次性提权
linux·运维·服务器
Fanstay9857 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker