Если данные файла начинаются с определенной шестнадцатеричной последовательности, выполните команду strings на файле

Bash:

while read -r f1 f2 rest; do
   printf '%s' "$f1" "$(expr " $f2" : '\([^:]*:[^:]*\).*' \| " $f2")" "$rest"; echo
   # the lone echo provides for the newline
done < yourfile

read разделит поля на $f1, $2, а все остальные будут втиснулся в $остальное. Затем во втором поле, $f2, мы запускаем expr, чтобы извлечь первое и второе поля, разделенные двоеточиями. Если это невозможно, то мы используем саму переменную $f2.

Sed:

sed -e '
   s/[^[:space:]]\{1,\}/\
&\
/2
   :loop
      s/\n\(.*:.*\):.*\n/\n\1\n/
   tloop
   s/\n//g
' yourfile

Сначала мы заключаем второе поле в \n, а затем запускаем цикл вокруг этой области, пока не останется всего два поля (или один разделитель полей).

Perl:

perl -pe 's/\G[^:\h]+:[^:\h]+\K\S+//,next while /\S\h+\S/g' yourfile

perl -pe 's/^\h*\S+\h+(?:(?!:)\S)+:(?:(?!:)\S)+\K\S+//' yourfile

perl -F'(\h+)' -lane '
   /:/ and $_ = join ":", (/[^:]+/g)[0,1] for $F[/^\h/?4:2];
   print @F;
' yourfile

Результат

0   22:16050847 0   16050847
0   rs62224609:16051249 0   16051249
0   22:16051250 0   16051250
0   GSA-rs138295790 0   16057310
0
20.04.2017, 12:51
3 ответа
h_signature=$(echo 58465300 | tr 'a-f' 'A-F')
read -r x a b x <<<$(od --endian=big -N 4 -t x2 yourfile | tr 'a-f' 'A-F')
case "$a$b" in "$h_signature" ) strings yourfile ;; esac

Мет-2:

dd if=yourfile count=4 bs=1 2>/dev/null |
perl -lpe '$_ = uc unpack "H*"' | xargs test "$h_signature" = && strings yourfile

Мет-3:

head -c 4 yourfile | xxd -ps -g 4 | grep -qwi "$h_signature" && strings yourfile
1
28.01.2020, 02:19

Чтобы увидеть если первые четыре байта файла - это конкретная строка XFS \ 0 (которой соответствует шестнадцатеричная последовательность байтов в вопросе):

if od -N 4 -a file | grep -qF 'X   F   S nul'; then
    strings file
fi

od -N 4 -a преобразует первые четыре байта файла в его формат отображения однобайтовых символов. Мы используем grep -qF , чтобы проверить вывод od на соответствие тому, что мы ищем.

На машине с прямым порядком байтов вы можете использовать od -N 4 без каких-либо дополнительных флагов и вместо этого использовать grep для 043130 000123 .

Или:

if od -N 4 -A n -c file | tr -d ' ' | grep -qF 'XFS\0'; then
    strings file
fi
1
28.01.2020, 02:19

Если вы регулярно используете этот тип файла, я бы определил его в вашем ~/.magic (или даже в системном магическом файле):

0 long 0x00534658 XFS-file

(при условии, что вы немного порядковая система). Теперь вы можете проверить с помощью команды file:

$ file testfile
testfile: XFS-file

И вы можете сделать это для тестирования:

if [[ `file -b testfile` == XFS-file ]]; then strings testfile; fi
2
28.01.2020, 02:19

Теги

Похожие вопросы