我有一个简短的 shell 脚本,可以从目录中获取鸡肉信息chickens
。这是我的三个 .txt 文件:
~\Desktop\Chickens (或子目录)
++++++++ yoke-o-ono.txt ++++++++
NAME: Yoke-o-ono
TYPE: Hen
COLOR: White
++++++++ zelda.txt ++++++++
NAME: Zelda
TYPE: Hen
++++++++ fido.txt ++++++++
NAME: Some Dog named Fido (WTF Fido?)
COLOR: Black
有许多可选属性,但我关心的是名称、类型和颜色。我想以以下格式将所有鸡打印到控制台:“[姓名][类型]-[颜色]“(如果字段不存在则打印空白)。
formatEcho () {
echo "[$1] [$2]-[$3]"
}
getChickens () {
find ~/Desktop/Chickens -name "*.txt" |
xargs grep -h -e "NAME" -e "TYPE" -e "COLOR" |
sed -E 's/^[A-Z].*:(.*$)/\1/g' |
sed -E 's/^[A-Z].*:(.*$)/\1/g' |
sed -E 's/^[A-Z].*:(.*$)/\1/g'
}
formatEcho $(getChickens)
然而,正如预期的那样,这只输出一只鸡。
[Yoke-o-ono] [Hen]-[White]
我可以使用一些帮助将 formatEcho 集成到 getChickens 方法中,以便显示每只鸡:
[Yoke-o-ono] [Hen]-[White]
[Some dog named Fido (WTF Fido?)] []-[Black]
[Zelda] [Hen]-[]
例如,使用的结果find
作为的参数formatEcho
。
编辑(尝试斯科特的答案)
bash-5.1$ sh script.sh
script.sh: line 21: shopt: globstar: invalid shell option name
awk: can't open file /Users/MYNAME/Desktop/Chickens/**/*.txt
source line number 14
脚本.sh:
shopt -s globstar
awk '
function formatEcho(na, ty, col) {
print "[" na "] [" ty "]-[" col "]"
}
FNR==1 {
if (NR != 1) formatEcho(name, type, color)
name=""; type=""; color="";
}
{ data = $0; sub($1 " ", "", data) }
$1=="NAME:" { name = data }
$1=="TYPE:" { type = data }
$1=="COLOR:" { color = data }
END { formatEcho(name, type, color) }
' ~/Desktop/Chickens/**/*.txt
答案1
你可以在 awk 中做到这一点,和狂欢:
shopt -s globstar
awk '
function formatEcho(na, ty, col) {
print "[" na "] [" ty "]-[" col "]"
}
FNR==1 {
if (NR != 1) formatEcho(name, type, color)
name=""; type=""; color="";
}
{ data = $0; sub($1 " ", "", data) }
$1=="NAME:" { name = data }
$1=="TYPE:" { type = data }
$1=="COLOR:" { color = data }
END { formatEcho(name, type, color) }
' ~/Desktop/Chickens/**/*.txt
这些data = $0; sub($1 " ", "", data)
语句将数据放在标签的右侧。这不是一种完美的方法,但它可以用于您在问题中显示的数据。
使用globstar
shell 选项在狂欢,
**
将进行子目录搜索。
您的问题已加标签狂欢,而且你在标题中两次提到“bash”,在评论中也多次提到。而且 我 在我的回答中两次提到“bash”,在评论中又多次提到。所以我认为这肯定是在 bash 中运行的。 Cyrus 的评论建议您至少使用 4.0 版的 bash。但这可能还不够。
所以,这必须在 bash 中运行。
- 如果你以笨拙的方式运行脚本,你必须说
bash script.sh
。如果你说sh script.sh
,你正在运行默认 shell (/bin/sh
),它可能符合 POSIX 标准,但可能不是 bash(它可能是 Bourne shell)— 请参阅评论以了解讨论。 - 如果你将它作为可执行脚本运行(执行
chmod +x
然后以 运行./script.sh
),则必须以“shebang”开头
或者#!/bin/bash
这必须是脚本的第一行。#!/usr/bin/env bash