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
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
Чтобы увидеть если первые четыре байта файла - это конкретная строка 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
Если вы регулярно используете этот тип файла, я бы определил его в вашем ~/.magic
(или даже в системном магическом файле):
0 long 0x00534658 XFS-file
(при условии, что вы немного порядковая система). Теперь вы можете проверить с помощью команды file
:
$ file testfile
testfile: XFS-file
И вы можете сделать это для тестирования:
if [[ `file -b testfile` == XFS-file ]]; then strings testfile; fi