【问题标题】:How to loop through a file in bash starting at a custom line?如何从自定义行开始循环遍历bash中的文件?
【发布时间】:2019-06-25 17:28:36
【问题描述】:

我有一个文件,我想循环使用 bash 脚本的特定部分。以下是它的格式示例:

FILE 1

(exclude)
. 

(Start loop from here)
.
.
.
(stop)

如何从我需要的行开始循环文件并在需要的地方停止?我想我需要一个 for 循环来应对这种情况?如果需要 grep,我确实知道第一行的模式。或者我所有文件的行号可能是恒定的(比如从 5 开始,在 9 停止)

【问题讨论】:

  • 如何描述要解析的部分?是在特定模式之后吗?从行号?
  • 循环执行什么?请描述您要完成的工作。
  • @gniourf_gniourf 该文件有可以作为模式的文本,但现在我想起来,每一行的模式都是不同的。所以也许按行号可能会更好。
  • 打开并循环遍历文件,在每次迭代时增加一个计数器,然后您可以使用计数器来确定行号以及从哪里开始做某事以及在哪里完成
  • 我们可以和你一起玩 20 个 Q,或者你可以编辑你的 Q 以包括样本输入(应该处理的记录和应该跳过的记录),该输入所需的输出,你当前的代码、输出和错误消息。对选定文本使用“编辑”菜单中的{} 工具,为code, data, ouput, error_msgs 设置正确的格式。祝你好运。

标签: bash file loops


【解决方案1】:

使用 AWK 设置状态机,当找到开始模式时将线的处理切换为 ON

  1. 找到停止模式时关闭处理(这允许处理多个开始/停止组

  1. 找到停止模式后退出脚本(这会终止所有处理并在您不关心停止模式之后的任何内容时加快处理速度)
awk '/stop/  {process = 0}
     process {print $1, $5}
     /start/ {process = 1}' inputfile

这可以放在一行中,但为了便于阅读,我在此处将其分开。

process 被用作布尔变量。如果是真的,从当前行打印几个字段。

/start//stop/ 表示正则表达式以匹配您将用来分隔要处理的文件的部分的字符串。您可以改为使用行号,例如您可以将 /start/ 测试更改为 NR == 120 以在第 120 行开始处理。

如果您希望在处理中包含开始行和结束行,只需将process 行移到/start/ 行之后,将/stop/ 行放在最后(基本上,颠倒它们的顺序)。

正如我所展示的,此脚本将处理文件中的多个启动/停止块。如果您只想处理第一个(或唯一),您可以将/stop/ 行更改为:

/stop/  {exit)

【讨论】:

  • 中肯的建议,先生!
【解决方案2】:

既然你说你有行号,你可以使用tail。例如,要循环从第 42 行开始的文件,你可以做一个

tail -n +42 YOUR_FILE | while line
do
    process_line "$line"
done

【讨论】:

    【解决方案3】:

    示例:从/etc/passwd 中提取用户名和主目录,从mail 开始,到nobody 结束。

    cat /etc/passwd |
    sed -n '/^mail/,/^nobody/p' |
    while IFS=: read user pw uid gid geco home sh line; do
      echo "$user: $home"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2012-07-25
      • 1970-01-01
      相关资源
      最近更新 更多