Из iptables -m owner --help
:
owner match options:
[!] --uid-owner userid[-userid] Match local UID
Вам необходимо указать UID, а не имя пользователя. Вместо этого попробуйте:
-A OUTPUT -i eth0 -p tcp --dport 2049 -m owner --uid-owner 0 -m state --state NEW,ESTABLISHED -j ACCEPT
declare -a list
readarray list < /path/to/species_list
for species in ${list[@]}; do
sed -ne "/$species/,/^\$/p" moldata
done
Обычно можно заключить в одинарные кавычки встроенный скрипт sed
, но мы используем переменную оболочки для поиска ваших данных и поэтому должны избегать $
, чтобы сохранить shell от попытки его разобрать.
$ awk '
NR==FNR{ sp[$0]; next } # this is for reading species data into sp array
/species/ { # from this point for moldata's lines
if (substr($0,2) in sp) { # if the read line match with data in sp array
print # first print title
while(getline > 0) { # and then read until blank line and print
if (NF == 0) { print ""; break }
print
}
}
}
' species_list moldata
>species_1
?????????CACTTGGArGGTGGAGCCAAGAAGGTTATTATTTCTGCTCCCAGTGCTGACGCGCCCATGTACGTGGTC
TGTCAACCTCGATTCTTATGACCCATCTGCTAAGGTCATTTCGAATGCTTCCTGCACCACCAACTGCCTCGCTCCCCT
>species_3
CAAAGCCGTAGGCAAAGTCATTCCTGCTCTCAACGGTAAACTGACTGGCATGGCCTTCCGTGTTCCCGTTCCAAATGT
CGGTTGTGGATCTTACTGTTCGCyTGGGAAAACCAGCCTCTTATGACrCCATTAAACAGAAGGTCAAGGAGGCTGCTG
>species_5
GTTCCGCAAAGCTCAATGCCCTATTGTTGAGCGTCTGACCAATTCTCTCATGATGCATGGCCGCAACAACGGCAAGAA
TGATGGCAGTGCGAATTGTTAAGCATGCCTTTGAAATCATCCACCTTCTGACTGGAGAGAATCCTCTTCAAGTACTCG
Если вы настаиваете на использовании awk
:
( echo -n '/^>('; paste -sd\| - <species_list | tr -d '\n'; echo -n ')/,/^$/' ) | \
awk -f - moldata
«По специальному разрешению пустая строка в качестве значения RS указывает, что записи разделены одной или несколькими пустыми строками», поэтому
awk ' BEGIN { OFS=FS="\n"; RS=""; ORS="\n\n" }
FNR==NR { for (k=0;k<NF;) ++species[">"$++k] }
$1 in species
' species_list moldata
Для одной записи вы можете сделать что-то вроде этого:
awk '/species_1/{print;while (getline line){if(line !~/species/) print line; else break} }' input.txt
>species_1
?????????CACTTGGArGGTGGAGCCAAGAAGGTTATTATTTCTGCTCCCAGTGCTGACGCGCCCATGTACGTGGTC
TGTCAACCTCGATTCTTATGACCCATCTGCTAAGGTCATTTCGAATGCTTCCTGCACCACCAACTGCCTCGCTCCCCT
Для нескольких элементов вы можете сделать что-то вроде этого:
$ while IFS= read -r line
> do
> awk -v spec="$line" '$0~spec{print;while (getline line){if(line !~/species/) print line; else break} }' input.txt
> done < species.txt
>species_1
?????????CACTTGGArGGTGGAGCCAAGAAGGTTATTATTTCTGCTCCCAGTGCTGACGCGCCCATGTACGTGGTC
TGTCAACCTCGATTCTTATGACCCATCTGCTAAGGTCATTTCGAATGCTTCCTGCACCACCAACTGCCTCGCTCCCCT
>species_3
CAAAGCCGTAGGCAAAGTCATTCCTGCTCTCAACGGTAAACTGACTGGCATGGCCTTCCGTGTTCCCGTTCCAAATGT
CGGTTGTGGATCTTACTGTTCGCyTGGGAAAACCAGCCTCTTATGACrCCATTAAACAGAAGGTCAAGGAGGCTGCTG
>species_5
GTTCCGCAAAGCTCAATGCCCTATTGTTGAGCGTCTGACCAATTCTCTCATGATGCATGGCCGCAACAACGGCAAGAA
TGATGGCAGTGCGAATTGTTAAGCATGCCTTTGAAATCATCCACCTTCTGACTGGAGAGAATCCTCTTCAAGTACTCG
Зная, что данные в примере OP всегда находятся через две строки после названия вида, мы можем загрузить названия видов в species.txt
в массив, а затем использовать цикл for, чтобы прочитать строку дважды и вывести ее.
$ awk 'FNR==NR{species[$0]}; NR!=FNR{ sub(/>/,"");if ($0 in species){ print $0; for(i=0;i<=1;i++) {getline data;print data} }}' species.txt input.txt
species_1
?????????CACTTGGArGGTGGAGCCAAGAAGGTTATTATTTCTGCTCCCAGTGCTGACGCGCCCATGTACGTGGTC
TGTCAACCTCGATTCTTATGACCCATCTGCTAAGGTCATTTCGAATGCTTCCTGCACCACCAACTGCCTCGCTCCCCT
species_3
CAAAGCCGTAGGCAAAGTCATTCCTGCTCTCAACGGTAAACTGACTGGCATGGCCTTCCGTGTTCCCGTTCCAAATGT
CGGTTGTGGATCTTACTGTTCGCyTGGGAAAACCAGCCTCTTATGACrCCATTAAACAGAAGGTCAAGGAGGCTGCTG
species_5
GTTCCGCAAAGCTCAATGCCCTATTGTTGAGCGTCTGACCAATTCTCTCATGATGCATGGCCGCAACAACGGCAAGAA
TGATGGCAGTGCGAATTGTTAAGCATGCCTTTGAAATCATCCACCTTCTGACTGGAGAGAATCCTCTTCAAGTACTCG