Я сравнил бы контрольные суммы каждого файла.
Сначала rootfs
папка дает следующую команду:
rootfs# find . -type f -print0 | xargs --null sha1sum --binary > ../rootfs.sum
Затем в targetfs
папка, проверьте каждый файл:
targetfs# sha1sum --check <PATH_TO_SUM_FILE> | grep FAILED
нужно использовать оператор согласования ~, а не оператор вычитания -:
$ awk '$2 ~ /^2$/' file
или использовать оператор равенства ==
, как @гленн ответ Джекмана.
Но давайте посмотрим на ваше предыдущее решение, чтобы объяснить, почему вы получили все строки.
awk '$2 - /^2$/ {print}' numbers.txt
Здесь, с каждым вводом строки, если выражение $2 - /^2$/
верно, Вы распечатаете эту строку, иначе ничего не сделаете. Потому что вы получили все строки, поэтому кажется, что выражение $2 - /^2$/
всегда оценивалось как истинное.
Как awk
оценивало это выражение?
При использовании оператора вычитания результат типа является числовым. Переменная $2
была числом, но /^2$/
является регулярным выражением, каково его числовое значение?
Ну, из POSIX awk документации:
Когда токен ERE появляется в виде выражения в любом контексте кроме в качестве правой руки оператора "˜" или "!˜" или в качестве одного из встроенные аргументы функции, описанные ниже, значение параметра результирующее выражение будет эквивалентно:
$0 ˜ /ere/
Таким образом, ваша программа awk
станет:
awk '$2 - ($0 ~ /^2$/) {print}' numbers.txt
Видите ли, каждая строка ввода будет проверяться регулярным выражением /^2$/
. Так как ни одна из ваших строк ввода не совпадает, результат выражения $0 ~ /^2$/
будет равен 0.
С вашим вводом, все вторые поля имеют значение больше 0 (вычитание до 0 делает его неизменным), что является истинным значением в awk
. Таким образом, выражение $2 - /^2$/
всегда истинно, потому что awk
выводит все строки.
~
является оператором совмещения образца, а не -
. Но если вы проверяете на равенство, то используйте оператор равенства ==
awk '$2 == 2' numbers.txt