我有一个文件,我只想循环使用bash脚本的特定部分。这是其格式的示例:
setState((){})
如何从所需行开始遍历文件并在需要的地方停下来?我认为我将需要一个for循环来解决这种情况?如果需要grep,我确实知道第一行的模式。或行号可能对我所有文件都是恒定的(例如,从5开始,在9停止)
答案 0 :(得分:1)
使用AWK设置状态机,当找到启动模式时,状态机将对行的处理切换为ON。
或
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/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