使用 awk 在脚本文件中引用特殊字符

使用 awk 在脚本文件中引用特殊字符

因此,我希望编写一个脚本文件,该文件接受用户输入的数字,并根据该数字执行某个命令。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 : '$2\n'
       ;;
    2)
       awk -F : '$1\n'
       ;;

我希望使用管道(请参阅上面的文件)作为字段分隔符,而不是冒号。任何答案都表示赞赏!

答案1

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

|是一个特殊字符,因此需要引用以防止 shell 尝试创建管道。

|同时也是一个awk特殊字符,用于分隔正则表达式中的替代模式。引用它的最佳方法是将其放入由单个字符组成的范围中,如[|]。 -F 选项设置 awk 变量 FS(字段分隔符),该变量用作正则表达式(RE、模式)。

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

'$2\n'是一个有效的 awk 程序,但它不符合您的预期。它处于没有任何动作的模式位置。因此,如果 $2 非空白,则模式为 True,并且整行都会被打印。

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

相关内容