我无法使用以下 awk 命令获得所需的输出。
$ cat /usr/data/doc
8675|Linux|UserA
8975|Linux|UserB
8975|Linux|UserC
8898|Windows|UserD
$ cat go
#!/bin/bash
exec awk -v arg=${1:?} '$1==arg' "${@:2}" /usr/data/doc
$ go 8975
预期输出:
8975|Linux|UserB
8975|Linux|UserC
但是上面的脚本没有提供预期的输出,它显示为空白。
这个
8675|Linux|UserA
8975|Linux|UserB
8975|Linux|UserC
8898|Windows|UserD
是管道分隔文件,GNU
AWK
默认行为是假设字段分隔符是一个或多个空白字符。你需要通知GNU AWK
它正在处理管道分隔的文件,这可以通过在FS
中设置BEGIN
来完成,即
awk 'BEGIN{FS="|"}$1==8975' /usr/data/doc
或者如果您将
8975
存储为 shell 变量,请说 arg
arg="8975"
awk -v arg="$arg" 'BEGIN{FS="|"}$1==arg' /usr/data/doc
当每个字段中有空格时,此命令可以正常工作,但是 现在没有空间了
需要进一步调查,您现在可以假设管道将始终用作分隔字符还是可能是管道或空格?
如果您想了解更多关于
FS
的信息,请阅读 8 强大的 Awk 内置变量 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR
(在 GNU Awk 5.1.0 中测试)