所以我想写一个脚本文件,它接受一个用户输入的数字,并基于这个数字,它将执行一个特定的命令。这个命令是 awk 命令,当然,使用字段分隔符。我在用 awk 在下面的文件中 /etc/passwd :

smiths|Login|2
olivert|Login|2
northj|Login|2
denniss|Login|2
smithd|Login|2
smiths|Time Reporting|210
olivert|Payroll|155
northj|Server Maintenance|70
northj|Logfile Reporting|45
denniss|Report Printing|80
smithd|Payroll Program Updates|150
smithd|Payroll Program Updates|180
smiths|Logout|2
olivert|Logout|2
northj|Logout|2
denniss|Logout|2
smithd|Logout|2

我的问题是,我试图使用管道作为字段分隔符,但当我尝试反斜杠转义管道(这是我认为我应该做的),它实际上没有引用它。如果我用结肠之类的东西,没关系:

case "$choice" in
    1)
       awk -F : '\n'
       ;;
    2)
       awk -F : '\n'
       ;;

我希望使用管道(参考上面的文件)作为字段分隔符,而不是冒号。欢迎回答!

最佳回复

正确的语法是 awk '-F[|]' '{ print }'

|是shell特殊字符,因此需要引用以防止shell试图生成管道。

但是|也是awk特殊字符,用于分隔正则表达式中的交替模式。最好的引用方法是将它放入一个不包含单个字符的范围内,如[|]。F选项设置awk变量FS(字段分隔符),该变量用作正则表达式(RE,pattern)。

然后整个事情需要引用,因为[…]也可以是一个shell特殊字符,它可以扩展文件名。

"$2\n"是一个有效的awk程序,但它不符合您的预期。它处于没有动作的模式位置。所以如果$2是非空的,图案就是真的,整行都会打印出来。

您需要一个操作,这就是{}所做的,并且您只需要选择一个字段并打印它。它不需要换行符——print会自动这样做。