Não é como se eu não tivesse tentado antes de perguntar ... aqui está minha tentativa ... mas parece muito complicado para mim. Desconsidere a lógica que lida com os arquivos sujos de forma graciosa, isso não fazia parte da questão e não é o foco da pesquisa de texto de qualquer maneira. Acontece que os arquivos que eu tenho às vezes não começam com "HEADER", mas com algum lixo, com todo o resto dos dados sendo absolutamente bons, sempre.
#!/bin/bash
file_to_scan="${1}"
name_to_lookup="${2}"
ASSUME_FIRST_LINE_IS_HEADER="false" # Sometimes input files begin with spurious lines
FILE_HEADER_REGEX='^\[#\][[:blank:]]+OWNER_NAME[[:blank:]]+NAME[[:blank:]]+SIZE\s*$'
FIELD_HEADER_NAME=' NAME'
FIELD_HEADER_SIZE=' SIZE'
if [ "$ASSUME_FIRST_LINE_IS_HEADER" == "true" ]; then
header_line=$(head -n 1 "${file_to_scan}")
else
header_line="$(
grep \
--colour=never \
--extended-regexp \
"${FILE_HEADER_REGEX}" \
"${file_to_scan}"
)"
fi
colstartend=($(
printf "${header_line}" \
| \
awk \
-v name="${FIELD_HEADER_NAME}" \
-v size="${FIELD_HEADER_SIZE}" \
'{
print index($0, name)+1;
print index($0, size);
}'
))
sed -E "1,/${FILE_HEADER_REGEX}/d" "${file_to_scan}" \
| \
awk \
-v name_to_lookup="${name_to_lookup}" \
-v colstart="${colstartend[0]}" \
-v offset="$(( ${colstartend[1]} - ${colstartend[0]} ))" \
'{
name_field = substr($0, colstart, offset);
sub(/ *$/, "", name_field);
if (name_field == name_to_lookup) {
print substr($1, 2, length($1)-2)
}
}'