因此,我希望编写一个脚本文件,该文件接受用户输入的数字,并根据该数字执行某个命令。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 会自动执行此操作。