Похоже, что grep думает, что Ваш XML-файл является двоичным, а не текст.
Если Вы хотите вынудить grep рассматривать Ваш файл как текст независимо от содержания, можно использовать --text
переключатель (принимающий GNU grep), как так:
grep --text "searchString" ./file.xml | wc -l
Обратите внимание, что, если все Вы хотите, должен считать соответствия, вероятно, лучше использовать grep --count
вместо того, чтобы передавать по каналу через wc -l
, сохранение Вас канал и вызов процесса.
Я думаю, есть 2 способа подходить к этому:
- Вы начинаете с нуля и построить все сами (LFS, вероятно, хороший выбор). Это дает вам максимальный контроль и отличный способ учиться, но это также довольно крутое и много времени.
- Есть некоторые существующие дистрибутив, которые вам нравятся, и возьмите его в качестве отправной точки.
Несколько лет назад я занял второй маршрут с Knoppix . Он отлично работал, но я хотел получить компакт-диск, я мог бы взять со мной во время путешествий и проходить в любой компьютер, и вдруг превратился в мою домашнюю установку: одни и те же инструменты, конфигурацию и т. Д. вместо ноутбука.
Обычно это сделано, имея USB-накопитель, где изменения вашего живого сеанса автоматически сохраняются, но я не хотел идти по этому маршруту. Были некоторые довольно существенные изменения, материал, которые мне не нужно на CD, который просто будет тратить пространство, но в основном я хотел, чтобы один автономный CD только для чтения только. Поэтому я пошел на решательский маршрут.
Если KNOPPIX соответствует вашему законопроекту, вы можете превратить его в почти все, что вам нравится с этим (посмотрите на все производные Knoppix!). В дополнение к моим изменениям, я полностью изменил опыт загрузки, поместите небольшое графическое меню Grub, сделали скрипт init, добавил новые варианты загрузки ...
Ресурсы:
- Knoppix Remastering Howto
- Настройка / ремастеринг Раздел на форумах.
Вы можете попробовать что-то вроде ремикса Fedora http://fedoraproject.org/wiki/Remix, а также Linux с нуля http://www.linuxfromscratch.org/. Затем попробуйте поместить их на USB.
Вы можете использовать unetbootin
для установки любого дистрибутива на любое устройство. Это автономный исполняемый файл, поэтому нечего устанавливать, просто загрузите его и запустите.
Unetbootin предлагает большинство hte основных дистрибутивов как живых, так и обычных версий.
ПРИМЕЧАНИЕ: Что эти живые дистрибутивы - больше, чем просто одна и та же система между перезагрузками. Многие предлагают динамическую область, где изменения могут быть сохранены, так что вы можете установить дополнительное программное обеспечение и настроить ваш рабочий стол, и он останется для вашей следующей перезагрузки.
Например, взгляните на документацию Ubuntu Persistence documentation :
Эта страница объясняет, как улучшить LiveCD только для чтения, добавив постоянное файловое хранилище на другом диске. В более поздней версии Ubuntu версии, вы можете вместо этого использовать usb-создатель инструмент для создания загрузочный USB флэш-накопитель с Live CD, и его пользовательский интерфейс имеет возможность добавить постоянную память на тот же самый USB-накопитель
Вот еще один, использующий форматирование вывода из ps
:
#!/usr/bin/sh -f
printf '%-8.7s%-8s%s\n' $(
ps -o uname=UID,pid=PID,args=APPNAME |
sed -n '1p;s/\( [0-9]* \).*\(-Dapp.name=[^ ]*\).*/\1\2/p'
)
В зависимости от его формата последовательность, для каждого 3 его аргументов printf
будет напечатана:
\n
ewline. Подстановка команды не цитируется специально . Обратите внимание на -f
, следующий за sh
в bang-line - он указывает, что оболочка должна не glob - поэтому нет опасности случайного создания имен файлов на основе специальных символов оболочки. Замена команды будет разделена на значения по умолчанию $ IFS
- космоса, tab, newline.
В подмене команды ps
печатает столбцы 3 - с UID , PID и APPNAME . ps
указан POSIX не для печати мест в любом поле , за исключением поля args =
. Таким образом, первые два столбца являются $ IFS
безопасными. Тем не менее, чтобы получить строку -Dapp.name
из поля args =
, ее необходимо обработать.
Поэтому sed
фильтрует его. В строках, содержащих по крайней мере два космический и строку -Dapp.name = , она печатает:
sed
не влияют на заголовки столбцов, напечатанные с 1p
, поскольку они не содержат -Dapp.name = последовательностей. Все остальные строки удаляются из выходных данных.
После применения printf
к sed
произвел разделение на $IFS
, вы можете ожидать продукцию как следующее:
UID PID APPNAME
sas 24431 -Dapp.name=myApp
sas 24431 -Dapp.name=myApp
sas 24431 -Dapp.name=myApp
sas 24431 -Dapp.name=myApp
sas 24431 -Dapp.name=myApp
, По-моему, тем не менее, этот заявление sed
работало бы немного лучше:
sed -n '1p;s/\( [0-9]* \).*-Dapp.name=\([^ ]*\).*/\1\2/p'
Это - в основном то же, за исключением того, что полосы -Dapp.name = часть от \2
, таким образом, это печатает как...
UID PID APPNAME
sas 24431 myApp
sas 24431 myApp
sas 24431 myApp
Потому что, поскольку это только печать строк, содержащих последовательность -Dapp.name = в любом случае, включая это своего рода просто нагромождение, которое в противном случае можно воспринимать как должное.
-121--78154-Чтобы «добавить небольшой шаг, как опция или сообщение подтверждения», вы можете сделать то, что артм предложил в комментариях к вашему вопросу: использовать сценарий обертки.
Другими словами, вместо того, чтобы обращаться непосредственно к несколько трудным аргументам командной строки dd, создайте сценарий в bash (или Python и т.д.), который принимает аргументы dd, которые вас интересуют,использование синтаксиса опций, который удобнее использовать. Сценарий проверяет, что аргументы разумны, и распечатывает аргументы (и, возможно, окончательную командную строку dd), чтобы можно было убедиться, что все в порядке. И затем сценарий просит вас "OK, чтобы продолжить? [y/N] "поэтому вы должны ввести y
, если вы хотите, чтобы сценарий действительно запускал dd командную строку, которая создана для вас.
Поэтому, если вы никогда не хотите, чтобы сценарий записывался в/dev/sda или его разделы, вы можете сделать это невозможным. Чтобы убедиться, что устройства ввода и вывода выбраны, скрипт может использовать команду blkid для получения UUID и метки диска для этих устройств. И т.д.
-121--58569-Другой дистрибутив, который стоит рассмотреть, - Puppy Linux . Это очень компактный, но довольно мощный и работает на широком спектре оборудования, включая старые машины с ограниченной оперативной памятью. Он имеет различные варианты создания загрузочных USB-дисков из запущенной установки Puppy. (Как ни странно, сайты Puppy не предлагают готовую загрузку USB: с этого нужно получить ISO и загрузиться, а затем создать загрузочный USB. Это возможно создать загрузочный USB из ISO напрямую, если вы знаете, как обойти Linux, но это гораздо проще сделать во время работы в Puppy).
Но основная причина, по которой я упомянул Щенка здесь, это то, что он легко позволяет вам создать индивидуальную версию. Просто установите все необходимые дополнительные компоненты и удалите/удалите ненужные компоненты, а затем попросите Puppy создать образ текущей настройки. Щенок имеет свои собственные репо, но он также может использовать различные другие репо, как Ubuntu и Slackware, так что у вас есть много программного обеспечения на выбор.
Отказ от ответственности: Я не связан с разработкой Puppy Linux, но он был моим любимым портативным дистрибутивом уже более 5 лет.