shell怎样随机读写遍历文件中指定分隔符的记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell怎样随机读写遍历文件中指定分隔符的记录相关的知识,希望对你有一定的参考价值。
通常我们用 "while read line ..." ,读取一行记录, 如果我们的这个line 不是以 ASCII 符 ‘0x0A’(换行符‘\n’),而是以ascii字符 '\0x01' 或其他非控制显示字符或非常用输入字符为分隔符分隔一条记录,每次读取这样的记录,然后再分解记录成字段,字段分隔符也类似,请问怎样读取?这样读取操作是为了避开字段中有换行符或常用输入符,如果你经常操作数据库表或常用jdbc,你懂得的,因为shell的字符处理没有高级语言C/C++/Java 强大。
参考技术A 简单的可以用 awk,可以指定记录分隔符和字段分隔符。复杂的可以用 perl 或 python,想怎么来怎么来。追问能举个示例吗?awk读取的不是以readline为基础读取的吗?
追答BEGIN RS=记录分隔符; FS=字段分隔符
在 awk 脚本头中指定其他标志
【中文标题】在 awk 脚本头中指定其他标志【英文标题】:Specify other flags in awk script header 【发布时间】:2020-07-14 23:15:08 【问题描述】:我想使用#!/bin/awk -f
标头编写一个awk 脚本文件,但我希望此脚本始终使用:
作为字段分隔符。但是由于某种原因,写#!/bin.awk -F: -f
给了我一个语法错误。我还希望这个脚本始终在同一个文件上运行,所以我也想对其进行硬编码。基本上,我想要的工作是这样的:
#!/bin/awk -F: -f -- /etc/passwd
后面是一些 awk 代码
【问题讨论】:
看起来问题在于不同的 Linux/Unix 系统没有一致地传递 shebang 参数。这篇文章提供了一些适用于各种系统的建议解决方法:***.com/questions/4303128/… 【参考方案1】:许多系统只允许在 shebang 行中使用单个参数,因此空格之后的所有内容都作为一个参数传递。
但是,您可以在脚本的 BEGIN
块中设置 FS
甚至 ARGV
,如下所示:
#!/bin/awk -f # using the #!/bin/awk -f
BEGIN
FS=":" # always use : as a field separator
ARGC=2
ARGV[1]="/etc/passwd" # always run on the same file
$3==0 # followed by some awk code
print $1
运行它:
$ chmod u+x program.awk
$ ./program.awk
root
【讨论】:
【参考方案2】:永远不要使用 shebang 来调用 awk,因为这与简单地在 shell 脚本中调用 awk 相比没有任何有价值的好处,但会剥夺你将传递给 shell 脚本的参数分离为 shell 处理的值的能力,awk 的值进程使用-v
,awk 的值使用脚本末尾的分配和文件名来处理,以便 awk 在其上运行。
只写:
#!/usr/bin/env bash
awk -F':' '
whatever
' /etc/passwd
这样,如果你有必要,你可以简单地将其调整为:
#!/usr/bin/env bash
sort "$1" |
awk -F':' -v foo="$2" '
whatever
' - FS="$3" "$4"
或者您需要做的任何其他事情来最恰当地使用传递给您的 shell 脚本的参数并进行增强(例如,添加输入的初始排序),而无需更改脚本的调用者。
【讨论】:
这个问题从来没有说 awk 脚本是从 shell 运行的。你是怎么推断的? @TobySpeight 该问题标有bash
,包括一个shebang,并使用/etc/passwd
作为输入。
啊,bash 标签 - 这很有意义。谢谢。 (很明显,其他的东西并不能区分从其他非 shell 程序运行,但确实如此)。
@TobySpeight 不客气。我认为这是“证据优势”:-)。以上是关于shell怎样随机读写遍历文件中指定分隔符的记录的主要内容,如果未能解决你的问题,请参考以下文章