如何从自定义行开始循环遍历bash中的文件?

时间:2019-06-25 17:28:36

标签: bash file loops

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

setState((){})

如何从所需行开始遍历文件并在需要的地方停下来?我认为我将需要一个for循环来解决这种情况?如果需要grep,我确实知道第一行的模式。或行号可能对我所有文件都是恒定的(例如,从5开始,在9停止)

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

由于您说的是行号,因此可以使用tail。例如,要遍历从第42行开始的文件,您可以执行

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

答案 2 :(得分:0)

示例:从/etc/passwdmail结束的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