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怎样随机读写遍历文件中指定分隔符的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何用shell提取文件中指定的字符串

adb shell下使用命令行删除android系统中指定文件和文件夹

adb shell下使用命令行删除android系统中指定文件和文件夹

Wpf中,怎样获取Canva中指定区域上都有哪些控件?

利用shell编程,提取注释文件中指定范围内的行

如何用shell提取文件中指定的字符串