【鸟哥的linux私房菜】查缺补漏(二)Bash的使用

【鸟哥的linux私房菜】查缺补漏(二)Bash的使用

前言

本文是笔者回顾复习《鸟哥的linux私房菜》时候对遗忘点的巩固笔记,同时还参考了github链接: 命令行的艺术结合具体例子加深理解,非详细学习笔记

基础

  • man bash 中文手册

  • 学会如何使用 man 命令去阅读文档。学会使用 apropos 去查找文档。知道有些命令并不对应可执行文件,而是在 Bash 内置好的,此时可以使用 help 和 help -d 命令获取帮助信息。你可以用 type 命令 来判断这个命令到底是可执行文件、shell 内置命令还是别名。

    apropos network
    apropos file
    help cd
    help -d cd
    
  • 学会使用 > 和 < 来重定向输出和输入,学会使用 | 来重定向管道。明白 > 会覆盖了输出文件而 >> 是在文件末添加。了解标准输出 stdout 和标准错误 stderr。

    echo "Line 1" > example.txt
    echo "Line 2" >> example.txt
    echo "Line 3" >> example.txt
    
    • example.txt内容:
    Line 1
    Line 2
    Line 3
    
    • 使用输入重定向和管道读取文件并处理其内容
    cat < example.txt | grep "Line" | tee output.txt | wc -l
    # cat < example.txt 从example.txt中读取内容
    # grep "Line":过滤出包含 "Line" 的行。
    # tee output.txt:将过滤后的输出同时写入 output.txt 和传递给下一个命令。
    # wc -l:计算行数。
    

    >:将命令的输出重定向到文件,覆盖文件内容。
    >>:将命令的输出追加到文件末尾。
    <:将文件的内容作为命令的输入。
    |:将一个命令的输出作为另一个命令的输入。

  • 学会使用通配符 * (或许再算上 ? 和 […]) 和引用以及引用中 ’ 和 " 的区别

    • * ? […]
    # 匹配所有 .txt 文件
    ls *.txt
    
    # 匹配名称中只有一个字符不同的文件,如 a.txt, b.txt
    ls ?.txt
    
    # 匹配名称中只有一个字符不同的文件,如 a.txt, b.txt
    ls ?.txt
    
    • 引用
    # 输出 $VAR 而不是变量的值
    VAR="world"
    echo 'Hello $VAR' # Hello $VAR
    # 输出 Hello world
    VAR="world"
    echo "Hello $VAR"
    # 计算以 file 开头的 .txt 文件的数量
    COUNT=$(ls file*.txt | wc -l)
    echo "Number of files: $COUNT"
    
  • 熟悉 Bash 中的任务管理工具:&,ctrl-z,ctrl-c,jobs,fg,bg,kill 等

    # 后台运行一个长时间执行的任务(示例中使用 sleep 模拟)
    sleep 60 &
    # 查看当前后台任务
    jobs # [1]+  Running                 sleep 60 &
    # 将后台任务切换到前台
    fg
    # 终止后台任务
    kill %1
    # 或者首先获取进程的 PID
    pidof sleep
    # 假设输出 PID 为 107829,然后使用 kill 终止该进程
    kill 107829
    # 运行一个长时间执行的任务(示例中使用 sleep 模拟)
    sleep 60 
    # 将暂停的任务切换到后台继续执行
    bg
    # 使用 ctrl-z 暂停任务
    # 使用 ctrl-c 终止任务
    
  • 学会基本的文件管理工具:ls 和 ls -l (了解 ls -l 中每一列代表的意义),less,head,tail 和 tail -f (甚至 less +F),ln 和 ln -s (了解硬链接与软链接的区别),chown,chmod,du (硬盘使用情况概述:du -hs *)。 关于文件系统的管理,学习 df,mount,fdisk,mkfs,lsblk。知道 inode 是什么(与 ls -i 和 df -i 等命令相关)。

    • ls -l
    ls -l # 详细列出目录内容
    

    示例输出

    drwxr-xr-x  2 user group  4096 Jul  9 12:34 directory
    -rw-r--r--  1 user group   123 Jul  9 12:34 file.txt
    

    每一列的意义:

      文件类型和权限 (drwxr-xr-x):
      分为四个部分d、rwx、r-x、r-x 
      rwx:表示文件所有者的对该文件所拥有的权限;
      r-x:表示文件所属组对该文件所拥有的权限;
      r-x:表示其他用户对该文件所拥有的权限。
      d: 目录
      -: 普通文件
      权限: r (读), w (写), x (执行)
    
      硬链接数 (2): 指向文件的硬链接数量。
    
      文件所有者 (user).
    
      文件所属组 (group).
    
      文件大小 (4096): 以字节为单位。
    
      修改日期和时间 (Jul 9 12:34).
    
      文件或目录名 (directory, file.txt).
    
    • 其他操作
    less file.txt # 分页查看文件内容
    
    head file.txt # 查看文件的前10行
    
    head -n 5 file.txt # 查看文件的前5行
    
    tail file.txt # 查看文件的最后10行
    
    tail -f file.txt # 实时查看文件末尾的内容(常用于日志文件)
    
    ln original.txt hardlink.txt # 硬链接 (ln): 创建指向相同文件数据的多个文件名
    ln -s original.txt symlink.txt # 软链接 (ln -s): 创建指向原始文件路径的符号链接
    # 区别:
    # 硬链接: 指向相同的 inode,删除其中一个文件不会影响另一个。
    # 软链接: 指向文件路径,删除原始文件会导致链接文件无效。
    
    chown user:newgroup file.txt # 更改文件所有者
    chmod 755 script.sh # 更改文件权限
    # 1:读 2:写 3:执行 7 = 1 + 2 + 3即rwx
    
    df -h # 查看文件系统的磁盘空间使用情况
    mount /dev/sda1 /mnt # 挂载文件系统
    sudo fdisk /dev/sda # 磁盘分区工具
    
  • 熟悉正则表达式,学会使用 grep/egrep,和的参数中 -i,-o,-v,-A,-B 和 -C

    • 正则表达式
      • .: 匹配任意单个字符。
      • *: 匹配前面的元素0次或多次。
      • +: 匹配前面的元素1次或多次。
      • ?: 匹配前面的元素0次或1次。
      • []: 匹配括号内的任意一个字符。
      • |: 或操作符。
      • ^: 匹配行的开头。
      • $: 匹配行的结尾。
      • : 转义字符,用于匹配特殊字符。
        更多资料
    • grep/egrep
    # -i: 忽略大小写。
    grep -i "pattern" file.txt
    
    # -o: 仅输出匹配的部分,而不是整行。
    grep -o "pattern" file.txt
    
    # -v: 反向匹配,显示不包含模式的行。
    grep -v "pattern" file.txt
    
    # -A: 附加参数,显示匹配行以及其后的指定行数。
    grep -A 2 "pattern" file.txt
    
    # -B: 附加参数,显示匹配行以及其前的指定行数。
    grep -B 2 "pattern" file.txt
    
    # -C: 附加参数,显示匹配行以及其前后的指定行数。
    grep -C 2 "pattern" file.txt
    
  • 学会使用xargs
    xargs 是一个强大的命令行工具,用于将输入作为参数传递给另一个命令。它可以处理来自标准输入或文件的输入,并将其逐行或按其他方式传递给指定的命令。

    # 删除file1.txt file2.txt file3.txt
    echo file1.txt file2.txt file3.txt | xargs rm 
    
    # 从 files.txt 中读取文件名并删除这些文件
    cat files.txt | xargs rm
    
    # -I 选项允许你指定一个替换字符串,xargs 会将其替换为输入的每一行
    echo file1.txt file2.txt file3.txt | xargs -I {} mv {} {}.bak 
    
    # -n 选项允许你指定每次传递给命令的最大参数个数
    # file1.txt file2.txt
    # file3.txt
    echo file1.txt file2.txt file3.txt | xargs -n 2 echo
    
    # -p 选项用于提示用户确认每个命令
    echo file1.txt file2.txt file3.txt | xargs -p rm
    
    # -0 选项用于处理以空字符(null)分隔的输入,通常与 find 命令结合使用
    find . -type f -print0 | xargs -0 rm
    

    综合案例

    # 创建一些示例文件和目录
    touch file1.txt file2.txt file3.txt
    mkdir dir1 dir2
    
    # 查找所有文件并备份
    find . -type f -print0 | xargs -0 -I {} cp {} {}.bak
    
    # 查找所有目录并备份
    find . -type d -print0 | xargs -0 -I {} cp -r {} {}_bak
    
    # 查找所有文件并删除
    find . -type f -print0 | xargs -0 rm
    
    # 查找所有目录并删除
    find . -type d -print0 | xargs -0 rmdir
    
  • 了解 Bash 中的“here documents”,例如 cat <<EOF …
    在 Bash 中,“here documents” 是一种多行字符串输入的方式,可以用于重定向输入到命令中。常见的语法是 <<EOF。

    cat <<EOF
    This is a line.
    This is another line.
    EOF
    # 这个命令会将多行字符串作为输入传递给 cat 命令,并输出到终端
    
    • 示例 1:创建一个文件
      使用 “here document” 创建并写入文件内容。

      cat <<EOF > myfile.txt
      This is the first line.
      This is the second line.
      EOF
      这会将多行字符串写入 myfile.txt 文件。
      
    • 示例 2:传递多行输入给命令
      将多行字符串传递给 grep 命令进行搜索。

      grep "pattern" <<EOF
      This is a line with pattern.
      This is another line.
      EOF
      # 输出:This is a line with pattern.
      
    • 示例 3:使用变量和命令替换
      使用双引号 " 来启用变量和命令替换。

      name="World"
      date=$(date)
      cat <<EOF
      Hello, $name!
      Today's date is: $date
      EOF
      # 输出:Hello, World!
      # Today's date is: Mon Jul 10 10:00:00 UTC 2024
      
  • 学会使用cut
    cut 命令用于从文件或标准输入中提取指定部分的文本。
    常用选项包括:
    -c:按字符提取。
    -d:指定字段分隔符(默认为制表符)。
    -f:指定提取的字段。
    假设有一个名为 example.txt 的文件,内容如下:

    1,John,Doe,25
    2,Jane,Smith,30
    3,Bob,Johnson,22
    4,Alice,Williams,28
    
    # 提取每行的前两个字符
    cut -c 1-2 example.txt # 1, 2, ...
    
    # 提取第一个字段(假设逗号 , 为分隔符)
    cut -d ',' -f 1 example.txt # 1 2 ...
    
    # 提取从第二个字段到最后一个字段
    cut -d ',' -f 2- example.txt # John,Doe,25 ...
    
    

    更多管道命令【Linux】管道命令

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值