shell脚本使用笔记2

shell脚本处理笔记

  • [一 打印文本中指定行](#一 打印文本中指定行)
    • [1. 打印单行](#1. 打印单行)
      • [方法1:使用 sed(最常用)](#方法1:使用 sed(最常用))
      • [方法2:使用 awk](#方法2:使用 awk)
      • [方法3:使用 head 和 tail 组合](#方法3:使用 head 和 tail 组合)
    • [2. 打印多行范围](#2. 打印多行范围)
    • [3. 打印不连续的多行](#3. 打印不连续的多行)
    • [4. 打印最后几行](#4. 打印最后几行)
    • [5. 打印除指定行外的其他行](#5. 打印除指定行外的其他行)
    • [6. 高级用法](#6. 高级用法)
    • [8. 管道处理示例](#8. 管道处理示例)
    • [9. 函数封装](#9. 函数封装)
  • [二 遍历当前目录下的所有文件夹](#二 遍历当前目录下的所有文件夹)
  • [三 乘法运算](#三 乘法运算)

一 打印文本中指定行

1. 打印单行

方法1:使用 sed(最常用)

bash 复制代码
# 打印第5行
sed -n '5p' filename.txt

# 或使用更简洁的语法
sed '5!d' filename.txt

方法2:使用 awk

bash 复制代码
# 打印第5行
awk 'NR==5' filename.txt

方法3:使用 head 和 tail 组合

bash 复制代码
# 打印第5行
head -n 5 filename.txt | tail -n 1

2. 打印多行范围

打印第5-10行

bash 复制代码
# 方法1:sed
sed -n '5,10p' filename.txt

# 方法2:awk
awk 'NR>=5 && NR<=10' filename.txt

# 方法3:head+tail
head -n 10 filename.txt | tail -n 6

3. 打印不连续的多行

打印第3、7、9行

bash 复制代码
# 方法1:sed(多条命令)
sed -n '3p;7p;9p' filename.txt

# 方法2:awk
awk 'NR==3 || NR==7 || NR==9' filename.txt

4. 打印最后几行

打印倒数第5行

bash 复制代码
# 方法1:tail + head
tail -n 5 filename.txt | head -n 1

# 方法2:awk(计算行数)
awk '{a[NR]=$0} END{print a[NR-4]}' filename.txt

5. 打印除指定行外的其他行

打印除第5行外的所有行

bash 复制代码
# 方法1:sed
sed '5d' filename.txt

# 方法2:awk
awk 'NR!=5' filename.txt

6. 高级用法

打印匹配模式的行及其后2行

bash 复制代码
# 打印包含"error"的行及其后2行
sed -n '/error/,+2p' filename.txt
# 或使用awk
awk '/error/{print; getline; print; getline; print}' filename.txt

打印偶数行/奇数行

bash 复制代码
# 打印偶数行
awk 'NR%2==0' filename.txt
# 或使用sed
sed -n 'n;p' filename.txt

# 打印奇数行
awk 'NR%2==1' filename.txt
# 或使用sed
sed -n 'p;n' filename.txt

8. 管道处理示例

bash 复制代码
# 处理其他命令的输出
ls -la | sed -n '5p'          # 打印第5行
ps aux | awk 'NR==2'          # 打印第2行
df -h | sed -n '2,4p'         # 打印第2-4行

9. 函数封装

bash 复制代码
#!/bin/bash

# 函数:打印文件指定行
print_lines() {
    local file=$1
    local start=$2
    local end=${3:-$start}  # 如果未提供结束行,则只打印起始行
    
    if [ ! -f "$file" ]; then
        echo "错误: 文件不存在"
        return 1
    fi
    
    sed -n "${start},${end}p" "$file"
}

# 使用示例
print_lines "filename.txt" 5      # 打印第5行
print_lines "filename.txt" 3 7    # 打印第3-7行

推荐使用 sed -n '行号p' filenamesed -n '起始行,结束行p' filename,这是最简洁高效的方法。

二 遍历当前目录下的所有文件夹

bash 复制代码
for subdir in `ls ./`; do
    if [ -d "$subdir" ]; then
        echo "文件夹: $subdir"
    else
        echo "$subdir not exist"
    fi
done

三 乘法运算

bash 复制代码
c = $[ 2 * 3 ]
d = $[ 2 * $c ]

注意中括号内空格

相关推荐
laplace01236 小时前
# 第六章 agent框架开发实践 - 学习笔记
人工智能·笔记·学习·语言模型·agent
坚持不懈的大白7 小时前
Leetcode学习笔记
笔记·学习·leetcode
中屹指纹浏览器7 小时前
双GAN网络驱动的动态指纹生成技术深度解析——原理、实现与抗检测优化
经验分享·笔记
JeffDingAI8 小时前
【Datawhale学习笔记】基于Gensim的词向量实战
人工智能·笔记·学习
FakeOccupational10 小时前
【电路笔记 PCB】Altium Designer : AD使用教程+Altium Designer常见AD操作命令与流程
开发语言·笔记
Hello_Embed10 小时前
RS485 双串口通信 + LCD 实时显示(DMA+IDLE 空闲中断版)
笔记·单片机·学习·操作系统·嵌入式·freertos
小乔的编程内容分享站10 小时前
C语言指针相关笔记
c语言·笔记
逐步前行10 小时前
SolidWorks2024_装配体实例(桌下抽屉)
笔记
_ziva_11 小时前
Miniconda 下载 + 安装 + VS Code 集成使用教程
笔记
tq108611 小时前
商业环境中的三重生命:自然、职业与组织的平衡模型
笔记