Linux基础复习第三天

Linux基础复习第三天

1.如何查看文件的大小、权限以及所属

以一个测试文件myfile.txt举例:

  • 查看文件大小、权限以及所属组
    • 文件权限由 10 个字符表示,格式为:[文件类型][所有者权限][组权限][其他用户权限]

    都可以通过:

    ls -lh <文件名>
    ls -l <文件名>
    

    参数解析:

    • -l:以长格式显示文件信息。
    • -h:以人类可读的格式(如 KB、MB)显示文件大小。

    权限解析

    • -:表示普通文件(d 表示目录,l 表示符号链接)。
    • rw-:所有者(user)有读(r)和写(w)权限。
    • r--:所属组(group)有读权限。
    • r--:其他用户有读权限。

    输出解析:

    • 输出中第 3 列是 文件所有者,第 4 列是 所属组

    示例:

    ls -lh myfile.txt 
    
    #输出为:
    -rw-rw---- 1 longlijisi ymyw 240 Jul  3 11:23 myfile.txt
    
    ls -l <文件名>
    
    #输出为:
    -rw-rw---- 1 longlijisi ymyw 1495 Jul  3 13:00 myfile.txt
    
  • 查看文件的详细元数据

    通过命令**stat <文件名>**,可以显示文件的详细信息,包括大小、权限、时间戳等。

    stat myfile.txt 
    
    #输出为:
    File: myfile.txt
      Size: 1495            Blocks: 8          IO Block: 4096   regular file
    Device: 802h/2050d      Inode: 2490388     Links: 1
    Access: (0660/-rw-rw----)  Uid: ( 1000/longlijisi)   Gid: ( 1003/    ymyw)
    Access: 2025-07-03 12:59:47.818078861 +0000
    Modify: 2025-07-03 13:00:05.805932197 +0000
    Change: 2025-07-03 13:00:05.805932197 +0000
     Birth: 2025-07-03 02:48:22.358429987 +0000
    

    输出解析:

    Size:文件的大小为1495字节,单位是字节,byte。文件内容的实际数据量;

    Blocks:文件在磁盘上占用8个块(block)。文件系统以“块”为最小存储单位(通常为 4KB),即使文件很小(如 1495 字节),也会占用至少 1 个块(4KB)。这里占用 8 个块(8 × 4KB = 32KB),说明文件可能包含元数据或其他存储分配策略。

    IO Blocks:文件系统的 块大小4096 字节(4KB),文件系统的 块大小4096 字节(4KB)

    Device:用于标识文件所在的磁盘或分区(如 /dev/sda1)。

    Inode:inode 是文件系统的元数据结构,存储文件的权限、时间戳、链接数等信息。每个文件有唯一的 inode 编号,但文件名可能通过硬链接指向同一 inode。

    Links:文件的硬链接数为1。硬链接数表示有多少个文件名指向该 inode,如果硬链接数大于 1,说明文件有多个名称(如通过 ln 命令创建的硬链接)。这里为 1,表示文件只有一个名称。

2.如何更改此文件的权限及所属

  • 修改文件的权限
    • 符号法chmod [u/g/o/a][+/-/=][r/w/x] 文件名

      #比如,给myfile文件,赋予所有人可执行权限
      chmod u+x myfile.txt
      
      #再次查看文件权限,输出为:
      -rwxrw---- 1 longlijisi ymyw 1.5K Jul  3 13:00 myfile.txt
      
    • 数字法chmod 权限数字 文件名

      #755所有者可读、写、执行(7),组用户可读、执行(5),其他用户可读、执行(5)。
      chmod 755 myfile.txt
      
      #输出为:
      -rwxr-xr-x 1 longlijisi ymyw 1.5K Jul  3 13:00 myfile.txt
      
  • 修改文件所属组

    在修改文件的所有者、所属组时,需进行提权,否则没有修改的权限。

    • chown :新属组 文件名

      sudo chown :dev myfile.txt 
      
      #输出为:
      -rwxr-xr-x 1 longlijisi dev 1.5K Jul  3 13:00 myfile.txt
      
    • chgrp 新属组 文件名

      sudo chgrp ymyw myfile.txt 
      
      #输出为:
      -rwxr-xr-x 1 longlijisi ymyw 1.5K Jul  3 13:00 myfile.txt
      

3.使用ll查看文件时,第一个字符串有什么含义。比如 drwxr-xr-x中开头的d和-rw-r–r–中开头的-。

在 Linux 中使用 ll 命令(即 ls -l)查看文件时,第一个字符表示文件的类型。以下是常见的文件类型及其含义:

符号含义说明
-普通文件最常见的文件类型,如文本文件、图片、可执行文件等。
d目录(Directory)表示这是一个目录(文件夹)。
l符号链接(Symbolic Link)表示这是一个软链接(指向其他文件或目录的快捷方式)。
c字符设备文件表示字符设备(如键盘、鼠标等按字符流输入输出的设备)。
b块设备文件表示块设备(如硬盘、U盘等按块读写的设备)。
s套接字(Socket)表示网络套接字文件(用于进程间通信)。
p命名管道(FIFO)表示命名管道(用于进程间通信的先进先出队列)。

4.什么是管道符,有什么作用

管道符(|)是 Unix/Linux 系统中用于连接命令的符号,它的作用

  • 前一个命令的输出结果传递到后一个命令的输入,无需中间文件存储。

  • 可以串联多个命令,完成多步骤的数据处理。

  • 结合 wcsortuniq 等工具,实现计数、排序、去重等操作。

  • 对大型文件或实时数据流(如日志)进行即时处理,无需等待数据全部加载。

  • 避免使用临时文件,直接通过管道符连接命令,使操作更高效。

常见的应用场景:

  • 过滤内容:

    ls | grep "log" # 查找当前目录中包含 "log" 的文件名。
    
  • 排序与查重:

    cat data.txt | sort | uniq #对文件内容排序并去除重复行。
    
  • 统计行数/单词数:

    cat file.txt | wc -l  # 统计行数
    cat file.txt | wc -w  # 统计单词数
    
  • 提取特定字段:

    ps aux | awk '{print $1}'  # 提取进程所有者
    
  • 处理日志文件:

    cat access.log | awk '{print $1}' | sort | uniq -c
    # 统计访问日志中不同 IP 的访问次数。
    
  • 杀掉占用端口的进程:

    sudo netstat -tuln | grep ':80' | awk '{print $7}' | cut -d/ -f1 | xargs sudo kill -9
    # 查找并终止占用 80 端口的进程。
    

5.如何统计目录下有多少文件和目录,比如/etc目录

  • 方法1:使用find命令
    • 统计文件数量(包括子目录)

      find /etc -type f | wc -l
      

      解释:
      find /etc:从 /etc 目录开始搜索。
      -type f:仅匹配文件(不包括目录)。
      wc -l:统计输出的行数(即文件数量)。

    • 统计目录数量(包括子目录)

      find /etc -type d | wc -l
      

      解释:
      -type d:仅匹配目录。

  • 方法2:使用lsgrep组合
    • 统计文件数量(包括子目录)

      ls -lR /etc | grep "^-" | wc -l
      

      解释:
      ls -lR /etc:递归列出 /etc 目录及其子目录下的所有文件和目录的详细信息。
      grep "^-":过滤以 - 开头的行(表示普通文件)。
      wc -l:统计行数。

    • 统计目录数量(包括子目录)

      ls -lR /etc | grep "^d" | wc -l
      

      解释:

      grep "^d":过滤以 d 开头的行(表示目录)。

  • 方法3:使用tree命令
    • 统计文件和目录总数,并过滤得到文件数量

      tree -a /etc | grep "/$" | wc -l
      

      解释:

      grep "/$":筛选以 / 结尾的行(即目录)。
      wc -l:统计目录数量

    • 统计目录数量

      tree -d /etc | grep -v "directories" | tail -n 1 | awk '{print $1}'
      

      解释:

      -d:仅显示目录。
      grep -v "directories":排除包含 “directories” 的行。

  • 方法4:Python脚本进行统计
    import os
    
    etc_path = "/etc"
    file_count = 0
    dir_count = 0
    
    for root, dirs, files in os.walk(etc_path):
        dir_count += 1  # 当前目录也算一个
        file_count += len(files)
    
    print(f"文件总数: {file_count}")
    print(f"目录总数: {dir_count}")
    

6.如何查看统计上面创建的文件有多少行

  • wc-l命令(最常用)

    高效、简单。但是默认包含空行,即文件末尾的换行符也算一行。

    wc -l myfile.txt # wc 是 "word count" 的缩写,-l 参数表示统计行数。
    
    #输出为:
    119 myfile.txt # 输出格式为:行数 文件名。
    
  • cat和wc组合

    wc -l 文件名 效果相同,但略微低效(多了一次管道传输)。

    cat myfile.txt | wc -l
    #输出为:
    119
    
  • 使用grep命令

    可排除空行,适合大文件处理。

    grep -v '^$' myfile.txt | wc -l # grep -v '^$' 过滤掉所有空行(^$ 表示空行)。
    
    #输出为:
    119
    
  • 使用Python脚本

    逐行读取文件并计数,适合大文件(内存占用低)

    with open("myfile.txt", "r") as f:
        lines = sum(1 for line in f)
    print(f"行数: {lines}")
    
  • 使用sedawk
    • sed方法,无需额外处理,适合快速获取总行数的情况。:

      sed -n '$=' myfile.txt # $= 表示输出最后一行的行号,即总行数。
      
      #输出为:
      119
      
    • awk方法,简洁、适合脚本嵌套:

      awk 'END{print NR}' myfile.txt # NR 是 awk 内置变量,表示当前行号(总行数)
      
      #输出为:
      119
      

7.如何只查看上面创建文件的前10行或者后10行

(1)查看文件前10行
  • head命令

    • head 文件名,默认查看文件的10行

      head myfile.txt
      
    • head -n 行数 文件名,可自定义查看文件的前n行内容

      head -n 10 myfile.txt
      
  • sed命令

    适用于小文件,或者结合脚本中进行操作。

    • sed -n '1,10p' 文件名

      sed -n '1,10p' myfile.txt
      

      解释:
      -n:禁用默认的输出(只输出匹配的行)。
      '1,10p':指定打印第1到第10行。、

  • awk命令

    需进行行号判断,适合结合字段处理,如特定列。

    • awk 'NR <= 10' 文件名

      awk 'NR <= 10' myfile.txt
      

      解释:
      NR:awk 内置变量,表示当前行号(从1开始计数)。
      'NR <= 10':匹配行号小于等于10的行。

(2)查看文件后10行
  • tail命令

    • tail 文件名,默认查看文件的10行

      tail myfile.txt
      
    • tail -n 行数 文件名,可自定义查看文件的后n行内容

      tail -10 myfile.txt
      
    • 实时查看文件的末尾变化(动态监控)

      tail -f myfile.txt 
      # -f 可以实时查看新增的内容
      
  • sed命令

    • sed -n '$-9,$p' 文件名

      sed -n '$-9,$p' myfile.txt
      

      原理:
      $:表示文件的最后一行。
      $-9:表示倒数第10行($-9 = 最后一行 - 9)。
      'p':打印匹配的行。
      注意:
      此语法依赖 GNU sed(大多数 Linux 发行版默认支持)。
      如果文件总行数少于10,会直接输出所有行。

  • awk命令

    • awk '{a[NR]=$0} END {for(i=NR-9;i<=NR;i++) print a[i]}' 文件名

      awk '{a[NR]=$0} END {for(i=NR-9;i<=NR;i++) print a[i]}' myfile.txt
      

      原理:
      a[NR]=$0:将每一行存储到数组 a 中(键为行号,值为行内容)。
      END:文件读取完成后执行操作。
      for(i=NR-9;i<=NR;i++):循环输出最后10行。
      特点:
      需要一次性读取整个文件到内存,适合小文件。
      可扩展性高(如输出中间行或自定义范围)。

8.如何实时查看一个文件内容的增加,比如/var/log/kern.log

使用tail -f 文件名,可以实时查看一个文件的末尾动态变化

tail -f /var/log/kern.log
实时追踪:首选 tail -f 或 tailf。
交互式查看:使用 less +F。
多文件监控:使用 multitail。
日志轮转处理:使用 tail -F。
高级分析:使用 logwatch 或 inotifywait。

9./var/log目录是干啥的,有哪些关键的日志

在 Linux 系统中,/var/log 是一个存储系统和应用程序日志文件的核心目录,记录了系统的运行状态、错误信息、安全事件、服务行为等关键数据。

/var/log的主要作用有:
  • 系统日志:记录系统启动、运行、关闭过程中的事件(如内核消息、服务状态、硬件检测等)。

    • 例如:系统崩溃、服务异常、硬件错误等。
  • 应用日志:记录应用程序(如 Apache、MySQL、SSH 等)的运行日志。

    • 例如:Web 服务器访问日志、数据库错误日志等。
  • 安全日志:记录用户登录尝试、权限变更、认证失败等安全相关事件。

    • 例如:SSH 登录失败、sudo 命令执行记录等。
  • 定时任务日志:记录 cronanacron 定时任务的执行情况。

  • 启动日志:记录系统启动过程中的硬件检测和初始化信息。

关键的日志和用途
日志文件作用常见用途
/var/log/messages系统全局日志(Red Hat/CentOS/Fedora 等系统默认使用)。记录系统启动信息、内核消息、服务状态、硬件事件等。
/var/log/syslog系统日志(Debian/Ubuntu 等系统默认使用)。类似 messages,但由 rsyslogsyslog-ng 管理。
/var/log/auth.log认证相关日志(Debian/Ubuntu 等系统使用)。记录用户登录、su 切换、sudo 命令、SSH 登录尝试(成功/失败)等。
/var/log/secure认证相关日志(Red Hat/CentOS/Fedora 等系统使用)。auth.log 功能相同,但文件名不同。
/var/log/kern.log内核日志。记录内核消息(如硬件错误、驱动问题、OOM 内存不足等)。
/var/log/dmesg内核环缓冲区日志(系统启动时的硬件检测信息)。用于诊断硬件故障、驱动问题或启动失败。
/var/log/boot.log系统启动日志。记录系统启动过程中的服务状态和错误信息。
/var/log/daemon.log后台守护进程日志(如 cron、atd 等)。记录后台服务的运行状态和错误信息。
/var/log/cron.log定时任务日志。记录 cron 或 anacron 定时任务的执行情况。
/var/log/mail.log邮件服务日志(如 Postfix、Sendmail)。记录邮件发送、接收、错误信息等。
/var/log/apache2/Apache Web 服务器日志(如 access.logerror.log)。记录网站访问请求和错误信息。
/var/log/nginx/Nginx Web 服务器日志(如 access.logerror.log)。记录网站访问请求和错误信息。
/var/log/mysql/MySQL 数据库日志(如 error.log)。记录数据库启动、错误、查询等信息。
/var/log/audit/审计日志(由 auditd 服务生成)。记录系统调用、文件访问等详细操作,用于安全审计。
/var/log/wtmp二进制格式日志,记录用户登录/登出信息。通过 last 命令查看用户登录历史。
/var/log/btmp二进制格式日志,记录失败的登录尝试。通过 lastb 命令查看登录失败记录。
/var/log/lastlog二进制格式日志,记录每个用户的最近一次登录信息。通过 lastlog 命令查看。
查看日志的常用命令
  • 实时监控日志
tail -f /var/log/syslog        # 实时查看日志新增内容
tail -F /var/log/kern.log      # 支持日志轮转(文件被压缩或重命名后自动跟踪新文件)
  • 搜索特定关键词
grep "ERROR" /var/log/messages  # 查找包含 "ERROR" 的行
grep "Failed password" /var/log/auth.log  # 查找登录失败记录
  • 分页查看大文件
less /var/log/syslog           # 分页浏览日志
  • 查看内核日志
dmesg                         # 查看内核环缓冲区日志
dmesg | grep -i error          # 过滤内核错误
  • 日志轮转管理

    • 日志文件可能通过logrotate工具压缩或轮转,旧日志通常以.gz结尾:

      zgrep "ERROR" /var/log/syslog-20250704.gz  # 查看压缩日志
      
关键场景示例
  • 系统崩溃或服务异常

    • 查看 /var/log/messages/var/log/syslog,搜索 CRITICALERRORFAILED 等关键词。
  • 安全入侵检测

    • 查看 /var/log/auth.log/var/log/secure,搜索 Failed passwordsudo 等记录。
  • 硬件故障排查

    • 查看 /var/log/dmesg/var/log/kern.log,搜索 Hardware ErrorDriver 等。
  • Web 服务问题

    • 查看 /var/log/apache2/error.log/var/log/nginx/error.log,分析 HTTP 错误。

10.家目录有什么作用,每个用户的家目录相同吗?如何进入当前用户的家目录

在 Linux 系统中,家目录(Home Directory) 是分配给每个用户的个人工作空间。

主要作用包括:
  • 个人文件存储:用户可以在家目录中保存个人文档、图片、音乐等文件。

    • 例如:/home/user1/Documents/home/user2/Pictures
  • 配置文件管理:多数应用程序会将用户的配置文件(如 .bashrc.vimrc)存储在家目录中,用于保存个性化设置。

  • 隐私保护:家目录默认仅对用户本人可读写,其他用户无法访问(除非权限被显式开放),保障数据安全。

  • 环境变量支持:系统通过环境变量 $HOME 标识用户的家目录路径,许多程序和脚本依赖此变量定位用户数据。

  • 登录默认位置:用户登录后,系统会自动进入其家目录,方便用户直接操作个人文件。

每个用户的家目录是不相同的:
  • 默认路径:普通用户的家目录位于 /home/用户名(如 /home/john/home/anna)。
  • 超级用户(root):其家目录通常为 /root,而非 /home/root
  • 自定义设置:管理员可通过 usermod 命令更改用户的家目录路径(如迁移到其他分区)。
进入当前用户的家目录
  • 使用 cd 命令:不带参数时,cd 会自动切换到当前用户的家目录。
cd
  • 使用波浪号 ~:波浪号 ~$HOME 的快捷符号,表示当前用户的家目录。
cd ~
  • 使用绝对路径:替换 用户名 为当前用户名(如 cd /home/john)。
cd /home/用户名
  • 通过环境变量$HOME 是系统预定义的环境变量,直接指向当前用户的家目录。
cd $HOME

11.什么是相对路径,什么是绝对路径

  • 相对路径

    是基于基于当前工作目录(Current Working Directory)的位置,描述目标文件或目录的路径。它依赖于当前所处的位置,而非根目录。

    • .:表示当前目录(如 ./file.txt)。
    • ..:表示上级目录(如 ../config/settings.json)。

    特点

    • 灵活性:路径较短,适应性强。
    • 环境依赖:如果当前工作目录变化,相对路径可能失效。
    • 可移植性:适合项目内部文件引用,便于迁移和协作。

    示例

    • 如果当前目录是 /home/user,文件路径为 documents/report.txt
    • 网页 HTML 中:<img src="images/logo.png">(相对于当前页面路径)。
  • 绝对路径

    是从文件系统的根目录(Linux 中为 /,Windows 中为盘符如 C:\)开始,描述文件或目录的完整路径。它明确标识了文件在整个文件系统中的位置。

    特点

    • 唯一性:路径固定,不受当前工作目录的影响。
    • 稳定性:无论程序运行在哪个位置,路径始终指向同一位置。
    • 冗长:路径较长,可能降低可读性和灵活性。

    示例

    • Linux:/home/user/documents/report.txt
    • Windows:C:\Users\user\Documents\report.txt
    • 网页 URL:https://example.com/images/logo.png(包含协议和域名)

12.什么场景下使用相对路径,什么场景下使用绝对路径

  • 相对路径的使用场景
    • 项目内部资源引用(如 HTML/CSS/JS 文件)。
    • 命令行操作相邻文件(如 cd src/cp ../config.env .)。
    • 团队协作开发(避免机器路径差异)。
  • 绝对路径的使用场景
    • 系统配置文件(如 Nginx 配置)。
    • 跨磁盘或跨分区访问文件。
    • 脚本中需要确定性引用资源(如日志文件路径)。

13.如何在一个文件中筛选某关键字,并且只展示有关键字的行。

  • 使用**grep**命令

    grep 是最常用的文本搜索工具,可以直接筛选包含关键字的行。

    基本语法

    grep "关键字" 文件名
    

    示例

    假设文件名为 example.txt,关键字为 error

    grep "error" example.txt
    
    • 输出:example.txt 中所有包含 error 的行。

    常用选项

    • 忽略大小写:

      grep -i "error" example.txt
      
    • 显示行号:

      grep -n "error" example.txt
      
    • 递归搜索多个文件:

      grep -r "error" /path/to/directory/
      
    • 反向匹配(显示不包含关键字的行):

      grep -v "error" example.txt
      
  • 使用awk命令

    awk 是强大的文本处理工具,可以根据条件筛选行。

    基本语法

    awk '/关键字/' 文件名
    

    示例

    awk '/error/' example.txt
    
    • 输出:example.txt 中所有包含 error 的行。

    进阶用法

    • 结合正则表达式:

      awk '/^error/' example.txt  # 匹配以 "error" 开头的行
      
    • 输出特定字段:

      awk '/error/ {print $1}' example.txt  # 只输出匹配行的第一个字段
      
  • 使用sed命令

    sed 是流编辑器,可以筛选并操作匹配的行。

    基本语法

    sed -n '/关键字/p' 文件名
    

    示例

    sed -n '/error/p' example.txt
    
    • 输出:example.txt 中所有包含 error 的行。
  • 使用Python脚本(适用于复杂需求)

    如果需要更灵活的处理(如计算数值、提取特定格式),可以用 Python 脚本。

    示例

    with open("example.txt", "r") as file:
        for line in file:
            if "error" in line:
                print(line.strip())
    
  • 结合findgrep搜索目录

    如果需要搜索整个目录下的文件:

    find /path/to/directory -type f -exec grep -l "error" {} \;
    
    • -l 选项会列出包含关键字的文件名。

14.如何在筛选后需要展示关键字的上下三行

  • 使用grep-C选项(推荐)

    语法

    grep -C 3 "关键字" 文件名
    
    • -C 3:表示显示匹配行的 前后各3行(总共7行)。
    • “关键字”:要搜索的文本。
    • 文件名:目标文件。
  • 分别指定上下文行数

    如果需要更灵活地控制上下文行数(例如前2行、后3行),可以结合 -A-B 选项:

    • -A NUM:显示匹配行后的 NUM 行。
    • -B NUM:显示匹配行前的 NUM 行。

    语法

    grep -A 3 -B 3 "关键字" 文件名
    
  • 递归搜索目录中的上下文

    如果需要在多个文件或目录中递归搜索,并显示上下文,可以添加 -r 选项:

    grep -r -C 3 "关键字" /path/to/directory/
    
  • 其他常用选项
    • 忽略大小写:添加-i

      grep -i -C 3 "error" file.txt
      
    • 显示行号:添加-n

      grep -n -C 3 "keyword" file.txt
      
    • 只输出匹配行数:添加-c

      grep -c -C 3 "keyword" file.txt
      

15.如何替换文件中的关键字,比如将文件中的aaa替换为bbb。

  • 使用 sed 命令(推荐)

    sed 是最常用的文本替换工具,支持直接修改文件或输出到新文件。

    语法

    sed -i 's/旧关键字/新关键字/g' 文件名
    
    • 替换文件中的所有 aaabbb

      sed -i 's/aaa/bbb/g' example.txt
      

      -i:直接修改原文件(若需备份,可使用 -i.bak 生成备份文件)。

      s/aaa/bbb/gs 表示替换,g 表示全局替换(一行中所有匹配项)。

    • 替换每行第一个匹配项(不加g)

      sed -i 's/aaa/bbb/' example.txt
      
    • 替换特定行的关键词

      sed -i '3s/old/new/' example.txt  # 只替换第3行的第一个匹配项
      
  • **结合grepsed**批量替换多个文件中的关键字

    如果需要递归替换目录下所有文件中的关键字的情况

    • 替换当前目录及其子目录中所有文件的 aaabbb

      sed -i 's/aaa/bbb/g' $(grep -rl 'bbb' ./*)
      

      注释:

      grep -rl 'bbb' ./*:递归查找包含 bbb 的文件并列出文件名。

      $(...):将命令结果传递给 sed

  • 使用awk命令

    awk 也可以实现替换,但通常不如 sed 直观。

    语法

    awk '{gsub(/旧关键字/, "新关键字"); print}' 文件名 > 新文件名
    

    示例

    • 替换文件中的 aaabbb

      awk '{gsub(/aaa/, "bbb"); print}' example.txt > new_example.txt
      
  • 使用tr命令(字符级替换)

    tr 适用于逐字符替换(如替换单个字符或字符集)

    语法

    tr '旧字符' '新字符' < 文件名 > 新文件名
    

    示例

    • 替换所有 aaabbb

      tr 'aaa' 'bbb' < example.txt > new_example.txt
      
  • 使用vim编辑器

    如果需要手动替换,可以使用 vim

    步骤

    (1)打开文件:

    vim example.txt
    

    (1)进入命令模式(按:),输入以下命令:

    :%s/aaa/bbb/g
    
    • %:表示对整个文件操作。
    • s/aaa/bbb/g:替换所有匹配项。

    (3)保存并退出:

    :wq
    
  • 使用perl命令

    perl 是功能强大的脚本语言,也可以用于替换

    示例

    • 替换文件中的 aaabbb

      perl -pi -e 's/aaa/bbb/g' example.txt
      
  • 注意事项
    • 备份文件:在执行替换前,建议备份原文件(例如使用 cpsed -i.bak)。
    • 正则表达式sedawk 支持正则表达式,可实现复杂替换(例如匹配数字、特殊字符等)。
    • 权限问题:确保有文件写入权限,否则替换会失败。

16. >和>>是干啥的,各有什么场景

在 Linux 系统中,>>>输出重定向 的两个关键操作符,它们的作用和使用场景如下

  • >:覆盖写入

    功能:将命令的标准输出(stdout覆盖写入到指定文件中。

    • 如果目标文件 不存在,则创建新文件。
    • 如果目标文件 已存在,则 清空文件内容,并将新输出写入文件。

    场景:

    • 生成新文件:需要将命令结果保存为一个新文件时。

      ls > filelist.txt  # 将当前目录列表写入 filelist.txt(覆盖原有内容)
      
    • 替换旧数据:需要替换文件内容为最新结果时。

      date > timestamp.txt  # 每次执行都会更新 timestamp.txt 为当前时间
      
    • 丢弃输出:将输出重定向到/dev/null(相当于丢弃)。

      command > /dev/null  # 执行命令时不显示输出
      
  • >>:追加写入

    功能:将命令的标准输出(stdout追加到指定文件的末尾。

    • 如果目标文件 不存在,则创建新文件。
    • 如果目标文件 已存在,则 保留原有内容,并将新输出追加到文件末尾。

    场景

    • 日志记录:需要将多次执行的输出结果保存到同一个日志文件中。

      echo "New log entry" >> log.txt  # 追加日志到 log.txt
      
    • 合并数据:将多个命令的输出结果合并到一个文件中。

      cat file1.txt >> combined.txt  # 追加 file1.txt 内容到 combined.txt
      cat file2.txt >> combined.txt  # 追加 file2.txt 内容到 combined.txt
      
    • 集群配置:在分布式系统中,将多个节点的公钥追加到认证文件中。

      cat id_rsa.pub >> ~/.ssh/authorized_keys  # 追加公钥到认证文件
      

17.如何在不打开文件的情况下,清空文件内容。

  • 使用>重定向

    将空内容重定向到文件,直接覆盖文件内容

    命令

    > 文件名
    

    示例

    > example.txt
    
    • 优点:语法简单,执行速度快。
    • 注意:文件必须存在且可写;若文件不存在,会创建一个空文件。
  • 使用turncate命令

    直接将文件大小设置为 0 字节

    命令

    truncate -s 0 文件名
    

    示例

    truncate -s 0 log.txt
    
    • 优点:语义清晰,适合脚本中调用。
    • 适用场景:对大文件高效,避免读取文件内容。
  • 使用cat /dev/null重定向

    /dev/null(空设备文件)的内容覆盖到目标文件。

    命令

    cat /dev/null > 文件名
    

    示例

    cat /dev/null > access.log
    
    • 优点:兼容性好,适合老版本系统或容器环境。
    • 原理/dev/null 是一个特殊的“黑洞”设备,读取它会得到空内容。
  • 使用echo命令

    向文件写入空字符串。

    命令

    echo -n > 文件名
    

    示例

    echo -n > data.txt
    
    • 注意-n 参数避免在文件末尾添加换行符(默认 echo 会添加换行)。
  • 使用dd命令

    /dev/null 读取数据并写入目标文件。

    命令

    dd if=/dev/null of=文件名
    

    示例

    dd if=/dev/null of=large_file.bin
    
    • 优点:适合需要复制或转换文件的场景,但此方法主要用于清空文件时效率较低。
  • 使用cp /dev/null命令

    /dev/null 的内容复制到目标文件。

    命令

    cp /dev/null 文件名
    

    示例

    cp /dev/null output.txt
    
    • 特点:与 cat /dev/null > 效果相同,但语法更简洁。
  • 使用 :> 操作符(Bash 特有)

    Bash 中的 :>> 的简写形式。

    命令

    :> 文件名
    

    示例

    :> config.ini
    
    • 注意:仅适用于支持此语法的 Shell(如 Bash)。
  • 使用 true: 命令

    true: 命令的输出(无内容)重定向到文件。

    命令

    true > 文件名
    
    : > 文件名
    

    示例

    true > temp.log
    
    • 特点:与 > 效果相同,但语义更明确(true 表示“无操作”)。

18.什么是文件描述符

文件描述符(File Descriptor,FD)是 Linux/Unix 系统中用于标识打开文件或 I/O 资源的非负整数

  • 本质
    • 文件描述符是一个非负整数(如 0123 等)。

    • 它是进程与内核之间的一个索引,指向内核维护的文件表项(记录文件状态、读写位置等信息)。

  • 作用
    • 标识资源:每个打开的文件、设备、管道或网络连接都会被分配一个唯一的文件描述符。

    • 操作资源:进程通过文件描述符调用系统调用(如 read()write()close())来读取、写入或关闭资源。

  • 常见文件描述符编号
    • 0:标准输入(stdin),默认从键盘读取数据。
    • 1:标准输出(stdout),默认输出到终端。
    • 2:标准错误(stderr),默认输出错误信息到终端。
    • 3+:其他资源(如文件、网络套接字等)。
  • 如何查看文件描述符
    • 通过 /proc/<PID>/fd

      Linux 系统中,每个进程的文件描述符存储在 /proc/<进程ID>/fd/ 目录下。

      示例:

      ls -l /proc/$$/fd  # 查看当前 Shell 进程的文件描述符
      
    • 通过 lsof 命令

      使用 lsof -p <PID> 查看进程打开的所有文件描述符。

      示例:

      lsof -p $$  # 查看当前 Shell 进程的所有文件描述符
      
  • 文件描述符的生命周期

    • 分配

      通过系统调用(如 open()socket()pipe())分配文件描述符。

    • 使用

      通过 read()write()send()recv() 等操作读写资源。

    • 关闭

      通过 close(fd) 释放文件描述符,防止资源泄漏。

      关闭后,文件描述符会被回收,可重新分配给其他资源。

19.什么是标准输入,标准输出,错误输出

  • 标准输入(Standard Input, stdin)

    定义:程序从外部接收数据的默认通道,通常与键盘关联,但也可以通过文件或管道重定向输入。

    文件描述符0(在 Unix/Linux 系统中)。

    用途:

    • 用户通过键盘输入数据(如命令行参数、交互式输入)。

    • 从文件或另一个程序的输出中读取数据(通过重定向或管道)。

    • 示例:

      在命令行中运行cat命令时,若不指定文件,cat会从标准输入读取数据并输出:

      $ cat
      Hello World  # 用户输入
      Hello World  # cat 输出
      
  • 标准输出(Standard Output, stdout)

    定义:程序向外部发送正常输出数据的默认通道,通常与终端屏幕关联,但可以通过重定向输出到文件或另一个程序。

    文件描述符1(在 Unix/Linux 系统中)。

    用途:

    • 显示程序的正常运行结果(如计算结果、状态信息)。
    • 将数据传递给其他程序(通过管道)。

    示例:

    • 在命令行中运行echo "Hello"

      $ echo "Hello"
      Hello  # 输出到终端
      
    • 在 Python 中使用print()

      print("Hello, stdout")  # 默认输出到 stdout
      
  • 标准错误(Standard Error, stderr)

    定义
    程序向外部发送错误信息的默认通道,通常与终端屏幕关联。与标准输出不同,标准错误不会被普通重定向操作影响

    文件描述符2(在 Unix/Linux 系统中)。

    用途:

    • 显示程序运行中的错误信息(如文件未找到、语法错误)。
    • 即使标准输出被重定向,标准错误仍会直接输出到终端,便于调试。

    示例:

    • 运行一个不存在的命令:

      $ nonexistent_command
      bash: nonexistent_command: command not found  # 错误信息输出到 stderr
      

20.如何查看历史执行的命令

  • 使用history命令

    这是最直接的方式,直接输入以下命令即可查看当前用户的命令历史:

    history
    
    • 默认显示:通常显示最近的 500 条命令(可通过 HISTSIZE 环境变量调整)。

    • 显示指定数量的命令

      history 10  # 显示最近的 10 条命令
      
    • 如果需要查找特定命令,可以结合 grep 使用

      history | grep "keyword"
      

      示例:

      查找所有包含apt的命令:

      history | grep "apt"
      
    • 显示带时间戳的命令历史

      默认情况下,history 命令不显示时间戳。可以通过设置环境变量启用时间记录:

      临时生效(当前会话)

      export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
      history
      

      永久生效(修改配置文件)

      ~/.bashrc~/.bash_profile中添加

      export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
      

      然后执行source ~/.bashrc生效。

    • 清除历史命令

      清除当前会话的历史记录:

      history -c
      

      清除 .bash_history 文件:

      > ~/.bash_history
      
  • cat直接查看历史命令文件

    历史命令默认保存在用户主目录的 .bash_history 文件中(对于 Bash Shell):

    cat ~/.bash_history
    # 或使用分页工具查看
    less ~/.bash_history
    
  • fc 命令

    fc(fix command)是 Bash 提供的另一个历史命令管理工具

    • 列出历史命令

      fc -l  # 列出所有命令
      fc -l 10  # 列出第 10 条开始的命令
      
    • 编辑并重新执行命令

      fc  # 打开默认编辑器(如 Vim)修改并执行历史命令
      

21.什么是别名,如何设置别名,ll是哪个命令的别名

别名(Alias) 是一种为命令、函数、接口或其他操作定义简短替代名称的机制。通过别名,用户可以用更简洁或更易记的方式执行复杂的命令,提高操作效率。

  • 命令别名

    将长命令或复杂命令参数替换为简短的名称。例如:

    • 在 Linux 中,ll 可以作为 ls -l 的别名。
    • 在 PowerShell 中,dirGet-ChildItem 的别名。
  • 网络接口别名

    为物理网卡绑定多个 IP 地址(虚拟接口),例如:

    • 在 Linux 中,为 eth0 设置 eth0:0 作为别名接口。
  • Linux/Bash 中的命令别名设置
    • 临时设置(当前会话有效):

      alias 别名='实际命令'
      # 示例:为 ls -l 设置别名 ll
      alias ll='ls -l'
      
    • 永久设置(编辑配置文件):

      修改~/.bashrc~/.bash_profile文件:

      echo "alias ll='ls -l'" >> ~/.bashrc
      

      使配置生效:

      source ~/.bashrc
      
    • 查看已有别名

      alias
      # 查看单个别名
      alias ll
      
    • 删除别名

      unalias 别名
      # 示例:删除 ll 别名
      unalias ll
      
  • 网络接口别名设置(Linux)
    • 临时设置(重启后失效):

      sudo ip addr add 192.168.1.100/24 dev eth0 label eth0:0
      
    • 永久设置(以 Debian/Ubuntu 为例):

      编辑/etc/network/interfaces 文件:

      auto eth0:0
      iface eth0:0 inet static
          address 192.168.1.100
          netmask 255.255.255.0
      

      重启网络服务:

      sudo systemctl restart networking
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值