Bash 在awk脚本头中指定其他标志
我想用Bash 在awk脚本头中指定其他标志,bash,awk,Bash,Awk,我想用#编写一个awk脚本文件/bin/awk-f标题,但我希望此脚本始终使用:作为字段分隔符。但是出于某种原因,写#/bin.awk-F:-F给了我一个语法错误。我还希望该脚本始终在同一个文件上运行,因此我也希望对其进行硬编码。基本上,我想做的是: #!/bin/awk -F: -f -- /etc/passwd 后面跟着一些awk代码,类似这样的代码应该可以: #!/bin/awk -f # using the #!/bin/awk -f BEGIN {
#编写一个awk脚本文件/bin/awk-f
标题,但我希望此脚本始终使用:
作为字段分隔符。但是出于某种原因,写#/bin.awk-F:-F
给了我一个语法错误。我还希望该脚本始终在同一个文件上运行,因此我也希望对其进行硬编码。基本上,我想做的是:
#!/bin/awk -F: -f -- /etc/passwd
后面跟着一些awk代码,类似这样的代码应该可以:
#!/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
这样做应该可以:
#!/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
永远不要使用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脚本的参数。切勿使用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脚本的参数。问题似乎在于不同的Linux/Unix系统没有一致地传递shebang参数。这篇文章提出了一些可以跨不同系统工作的解决方法:问题似乎在于不同的Linux/Unix系统没有一致地传递shebang参数。这篇文章有一些建议的变通方法,可以在不同的系统中使用: