如果其中一个字段等于用户输入,我有以下脚本来过滤 ascii 表:
ascii () {
arg1=$1
cmd=$(man ascii | awk '/000/,/077/ {print}' | sed '/^$/d')
if [ #$ -eq 0 ]
then
echo "${cmd}"
else
newcmd=$(echo "${cmd}" | awk '{for(i=1;i<NF;i++) if ($i=="${arg1}") {print $0}}')
echo "${newcmd}"
fi
}
不用说,它不起作用,但我收到以下错误:
bash: [: missing `]'
并且 awk 字符串内显示的颜色在我的 shell 实例中都是紫色的,所以我假设“${arg1}”没有被正确解释
(我使用 var 作为用户输入的第一个参数,因为 awk 也使用美元符号语法,而且我不知道如何区分函数 args 和 awk 字段)
答案1
我认为这可能是您想要做的,但既没有示例输入,也没有预期输出,也不知道哪些值可以作为参数传递给函数,这是一个未经测试的猜测:
ascii() {
man ascii |
awk -v tgt="$1" '
/000/ { f=1 }
f && NF && ((tgt == "") || index(" "$0" "," "tgt" "))
/077/ { f=0 }
'
}
看如何在 awk 脚本中使用 shell 变量有关在 awk 脚本中使用 shell 变量值的更多信息。
man ascii
在我的系统上输出“没有 ascii 的手动输入”,所以我不知道该命令在您的系统上输出什么格式,但是如果 awk 脚本的输入在您关心的部分中包含非空白的空格(例如制表符)然后执行此操作或类似操作将所有空格转换为空格,以便与目标字符串进行比较:
ascii() {
man ascii |
awk -v tgt="$1" '
/000/ { f=1 }
{ rec=$0; gsub(/[[:space:]]+/," ",rec) }
f && NF && ((tgt == "") || index(" "rec" "," "tgt" "))
/077/ { f=0 }
'
}
通过仅在设置和时执行tgt
相关操作,可以更有效地编写,例如:f
NF
ascii() {
man ascii |
awk -v tgt="$1" '
!NF { next }
/000/ { f=1 }
f {
if ( tgt == "" ) {
print
}
else {
rec = $0
gsub(/[[:space:]]+/," ",rec)
if ( index(" "rec" "," "tgt" " ) {
print
}
}
if ( /077/ ) {
f=0
}
}
'
}
但对于输入手册页的大小来说,不值得担心效率而不是简洁性。