在 Shell 脚本中高效地逐行读取文件

2023-11-07

逐行读取文件是许多 shell 脚本中的常见任务,因为它允许您单独处理文件的每一行并根据每一行的内容执行操作。在 Linux shell 脚本中逐行读取文件的方法有多种,但有些方法比其他方法更有效。在本文中,我们将探讨在 Linux shell 脚本中逐行读取文件的一些最有效的方法。

使用 while 循环

在 shell 脚本中逐行读取文件的最基本方法是使用 while 循环和 read 命令。 read 命令从文件中读取一行输入并将其存储在变量中,然后可由脚本进行处理。 while 循环允许您迭代文件的各行,直到到达末尾。下面是一个示例:

1
2
3
4
5
6
7
#!/usr/bin/env bash
 
# 逐行读取文件
while read line; do
  # 处理单行内容
  echo "$line"
done < file.txt

这种方法简单易懂,但有一定的局限性。一个限制是读取命令一次只能读取一行,因此对于包含多行的大文件来说,速度可能会较慢。另外,read命令只能从标准输入(stdin)读取,因此必须使用

将 while 循环与 cat 一起使用

在 shell 脚本中逐行读取文件的更有效方法是将 cat 命令与 while 循环结合使用。 cat 命令读取文件并将其内容输出到 stdout,然后可由 while 循环处理。下面是一个示例:

1
2
3
4
5
6
7
#!/usr/bin/env bash
 
# 逐行读取文件
while read line; do
  # 处理单行内容
  echo "$line"
done < <(cat file.txt)

此方法比读取命令更有效,因为它将整个文件一次读取到内存中,而不是一次读取一行。对于包含多行的大文件来说,这可能会更快。此外,cat 命令可以从任何文件中读取,而不仅仅是 stdin,因此您可以使用它从多个文件或不在当前目录中的文件中读取。

将 while 循环与 sed 一起使用

在 shell 脚本中逐行读取文件的另一种有效方法是结合使用 sed 命令和 while 循环。 sed 命令是一种功能强大的文本处理工具,可以读取文件并将其内容一次一行输出到 stdout。下面是一个示例:

1
2
3
4
5
6
7
#!/usr/bin/env bash
 
# 逐行读取文件
while read line; do
  # 处理单行内容
  echo "$line"
done < <(sed -n -e 1p file.txt)

此方法类似于 cat 命令,但效率更高,因为它一次只输出一行。对于包含多行的大文件来说,这可能会更快。此外,sed命令有许多选项和功能可用于操作输出,因此它是一个非常灵活的文本处理工具。

综上所述,在 Linux shell 脚本中逐行读取文件的方法有多种。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Shell 脚本中高效地逐行读取文件 的相关文章

  • 如何使用AWK从文件中连续输出行

    我有一个多行文件 我想连续输出文件的某些行 比如第一次 从第1行打印到第5行 下次 打印第2行到第6行 依此类推 我发现 AWK 是一个非常有用的函数 我尝试自己编写代码 但它什么也没输出 以下是我的代码 bin bash for n in
  • 是否可以在我的 shell 文件中使用 GitHub 机密?

    这是我在 GitHub 存储库上的简单操作 name CI on push branches main jobs build runs on ubuntu latest steps name Get my account my infra
  • 如何在 android studio 中监听 shell 命令的响应?

    在 Android 终端模拟器中 我可以输入以下命令 gt su gt echo class power supply battery charge rate 根据手机的充电方式 输出将为 无 正常 或 涡轮 我希望能够检索此输出并存储它作
  • 将图像上传到 spring mvc 中的文件夹

    我尝试将图像上传到我的资源中的文件夹 resouces images demo jpg 但它无法运行 你能帮忙在春天上传到我的资源吗mvc 如果我上传到 C test demo jpg 没关系 我的样本 String filename Fi
  • Java-将文件复制到新文件或现有文件

    我想写一个函数副本 文件f1 文件f2 f1 始终是一个文件 f2 是文件或目录 如果 f2 是一个目录 我想将 f1 复制到该目录 文件名应保持不变 如果f2是一个文件 我想将f1的内容复制到文件f2的末尾 例如 如果 F2 具有内容 2
  • 命令行/shell 帮助文本是否有“标准”格式?

    如果没有 是否有事实上的标准 基本上我正在编写命令行帮助文本 如下所示 usage app name options required input required input2 options a argument Does someth
  • File.Delete 进程无法访问该文件,因为该文件正在被另一个进程使用

    public bool DownloadMp3File DownloadedMp3 mp3 WebClient client new WebClient string filePath bool wasDownload false try
  • 在 Bourne Shell 中从变量中删除换行符

    在 bourne shell 中我有以下内容 VALUES some command that returns multiple line values echo VALUES 好像 ONE TWO THREE FOUR 我希望它看起来像
  • 如何在Java中读取文件的最后“n”个字节

    如何在不使用 RandomAccessFile 的情况下从文件中读取最后 n 个字节 我的文件中的最后 6 个字节包含写回文件时的重要信息 我需要写入原始文件 然后将最后 6 个字节附加到其他地方 有什么指导吗 谢谢 你必须使用随机存取文件
  • 使用单个 shell 脚本运行 React 和 Flask

    我构建了一个使用 ReactJS 作为前端和 Flask 作为中间件的应用程序 我可以使用以下命令序列来执行它 npm start cd Equation Solver python m flask run 执行第一个命令后 我必须打开另一
  • 传递到 mvn exec:java 时保留参数间距等

    我有一个启动 Maven exec java 进程的 shell 脚本 exec mvn exec java Dexec mainClass Dexec args 现在可悲的是如果我跑步 myMagicShellScript arg1 ar
  • 在 C# 中创建文件的最快方法

    我正在运行一个程序来测试在包含大量文件的文件夹中查找和迭代所有文件的速度 该过程中最慢的部分是创建超过 100 万个文件 我目前正在使用一种非常幼稚的方法来创建文件 Console Write Creating 0 N0 file s of
  • Android 11 - 访问我的应用程序 Android/Data 文件夹中的文件

    由于某种原因 我真的很挣扎 希望有人能帮助我指明正确的方向 我的目标是 Android 11 API 30 这似乎是所有问题的根源 降低目标可能对我有用 但谷歌似乎最终会迫使我走上这条路 所以我不妨弄清楚这一点 我的应用程序通常会按照标准写
  • PHP is_file 和服务器根相对路径

    请问如何使用 is file 和 folder file jpg 这样的路径 谢谢你 如果路径以 开头 则表示该路径是绝对路径 当路径是相对路径时 即不以 开头 则采用相对于 php 脚本的路径 如果您希望 folder file jpg
  • 在大型文本文件中查找重复记录

    我在一台 Linux 机器 Redhat 上 并且有一个 11GB 的文本文件 文本文件中的每一行包含单个记录的数据 并且该行的前 n 个字符包含该记录的唯一标识符 该文件包含略多于 2700 万条记录 我需要验证文件中不存在具有相同唯一标
  • 如何在c#中使用net user

    我正在尝试将 net user 与 c 一起使用 System Diagnostics ProcessStartInfo proccessStartInfo new System Diagnostics ProcessStartInfo n
  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • 将多个参数传递给 UNIX shell 脚本

    我有以下 bash shell 脚本 理想情况下我会用它来按名称杀死多个进程 bin bash kill ps A grep awk print 1 然而 虽然此脚本有效 但传递了一个参数 端镀铬 脚本名称为end 如果传递多个参数 则它不
  • 使用 GIT_PS1_SHOWCOLORHINTS 自定义 __git_ps1 的颜色

    我尝试过的 我已更新我的提示以包含分支名称 git ps1 另外 我设置GIT PS1 SHOWCOLORHINTS 问题 提示正确显示 然而 树枝的颜色始终是绿色的 我预计肮脏的树枝会是红色的 文档指出 颜色基于 git status s
  • 从命令行获取设备的 Android SDK 版本

    我计划构建一个自动化系统 用于将 Android 版本部署到各种设备 以便使多平台开发更加轻松 有没有办法通过android shell或adb获取连接设备的sdk版本 将有一台计算机连接多个测试设备 我计划编写一个脚本 该脚本将从构建服务

随机推荐

  • SSM集成Redis的小案例

    一 详情介绍 这里是使用Window版本的Redis 将下载好的Windows版本的Redis压缩包解压到一个目录下 客户端使用的是Redis Desktop Manager 使用Redis需要启动相应的服务 操作如下图所示 备注 双击打开
  • LDAP应用技术简述

    LDAP应用技术简述 一 一 简介 a X500 目录服务 OSL X 500目录是基于OSI网络协议的目录服务协议 也是LDAP的前身 但是X 500的缺点是不支持TCP IP 而是支持OSI协议 显然 在 Windows等个人电脑上不可
  • Jenkins

    Jenkins 文章目录 Jenkins 1 Jenkins概述 Jenkins特性 2 系统集成工具 Jenkins和Hudson 3 部署方案 手动部署流程 自动化署流程 4 Jenkins svn自动部署 环境准备 yum部署Jenk
  • Linux安装Oracle JDK

    从公司云平台申请的虚拟机默认安装了open jdk 想改成oracle 官方的jdk 1 检查系统jdk版本 root localhost software java version openjdk version 1 8 0 102 Op
  • vue js 获取yaml文件内容并且将文件内容转换为JSON

    写在公共js内 export function eadFile file const reader new FileReader const promise new Promise resolve reject gt reader onlo
  • 通过libusb读取鼠标数据

    include
  • 临界区锁 InitializeCriticalSection()--- EnterCriticalSection()--LeaveCriticalSection()

    1 InitializeCriticalSection 此函数初始化一个临界区对象 格式 void InitializeCriticalSection LPCRITICAL SECTION lpCriticalSection 参数 lpCr
  • C++ VTK 8.2 如何绘制弹簧图形

    创建圆柱 vtkSmartPointer
  • c++primer 第十五章笔记

    15 1 oop 概述 面向对象程序设计核心思想 数据抽象 继承 动态绑定 继承 联系在一起的类构成一种层次关系 通常在层次关系的根部有一个基类 派生类 其他类则直接或间接地从基类继承而来 继承示例代码 class Quote public
  • c语言之矩阵

    矩阵作为线性代数核心内容之一也是刷题人时常会遇到的一种类型 本篇博客简单介绍一下矩阵转置 上三角矩阵以及杨氏矩阵 1 转置矩阵 输入m行n列的矩阵以n行m列的方式打印出来 只要将数组的行列进行交换即可 并不难想也不难写 相应练习 牛客网BC
  • 【GPIO】通用输入/输出工作模式原理

    1 GPIO基本结构 保护二极管 IO引脚上下两边两个二极管用于防止引脚外部过高 过低的电压输入 当引脚电压高于VDD时 上方的二极管导通 当引脚电压低于VSS时 下方的二极管导通 防止不正常电压引入芯片导致芯片烧毁 P MOS管和N MO
  • C/C++什么是内存泄露,内存泄露如何避免?

    C C 什么是内存泄露 内存泄露如何避免 1 内存溢出 2 内存泄漏 3 造成内存泄露常见的三种情况 3 1 指针重新赋值 3 2 错误的内存释放 3 3 返回值的不正确处理 4 如何避免内存泄露 5 内存泄露检测工具valgrind 1
  • abstract方法必须在abstract类中 这句话是对的还是错的?

    对 参考文章 https zhidao baidu com question 435526297 html interface中所有的方法都是抽象的 抽象类中部分方法是抽象的 实现interface接口的类必须重写全部方法 而继承抽象类的子
  • UE4(虚幻4)基础:编辑样条曲线实现道路

    一 新建地形 在模式中点击山形状的图标会出现以下界面 下面那几个你可以自己随便调节一下看看都是干什么 都是可视化的东西 很简单 至于这个材质球 在你创建项目的时候如果是默认的 那么系统会默认给你添加新手包 找到StartContent这个文
  • java的动态代理过程

    重点知识回顾 反射机制 在运行期间 对于任意类都能知道它的所有属性和方法 对于任意对象都能调用它的属性和方法 静态代理 通过编写代码完成增强效果 即是通过我们自己编写相关的代码实现增强效果 java的动态代理过程 我们都知道java动态代理
  • 缺失值填充4——使用线性模型(岭回归、Lasso回归、ElasticNet回归)填充序列缺失值

    原始的问题可能是 一个X 包含x1 x2 缺失x x3 预测 gt y 模型填充缺失值 使用 x1 x2 x3 y 预测 gt 缺失x 算法思路 Lasso回归 在线性回归结尾加入绝对值和的正则化方法 L1正则 岭回归 在线性回归结尾加入平
  • 7.集成测试

    一 集成测试介绍 测试 单元测试 集成测试 系统测试 软件开发 需求 高层设计 底层设计 代码 灰盒测试 定义 集成测试 集成测试 综合测试 联合测试 整体测试测试 实验测试 集成测试是软件测试的阶段 在该阶段中 各个软件模块被组合在一起并
  • MD5算法是什么?

    MD5 消息摘要算法 5 是一种广泛使用的加密哈希函数 可生成 128 位 16 字节 哈希值 它由 Ronald Rivest 于 1991 年设计 用于从可变长度输入生成固定大小的输出 该输出代表输入的指纹 为什么 MD5 很重要 传输
  • 如何使用 Homebrew 在 macOS 上安装 NVM

    Node Version Manager NVM 是一种广泛使用的工具 允许开发人员在单台计算机上管理 Node js 的多个版本 它的重要性怎么强调都不为过 因为 Node js 应用程序有时可能是特定于版本的 并且不同的项目可能需要不同
  • 在 Shell 脚本中高效地逐行读取文件

    逐行读取文件是许多 shell 脚本中的常见任务 因为它允许您单独处理文件的每一行并根据每一行的内容执行操作 在 Linux shell 脚本中逐行读取文件的方法有多种 但有些方法比其他方法更有效 在本文中 我们将探讨在 Linux she