найти шаблон в огромном наборе файлов без параллелизма GNU

Это происходит из-за того, что сценарий был сохранен редактором, который использует окончания строки -DOS (, например Notepad++, например ). Вам придется удалить их из ваших скриптов.

Для этого либо используйте dos2unixв файле скрипта, либо

$ tr -d '\r' <script >script.new && mv script.new script

(это удалит все возвраты каретки из в любом месте в скрипте)


Что касается кода в скрипте:

:
iter=1
if [ -f iter.txt ]
   then rm./iter.txt 
fi  

Возможно, это должно выглядеть примерно так

iter=1
if [ -f "./$iter.txt" ]; then
   rm "./$iter.txt"
fi

Это удаляет файл 1.txtиз текущего каталога, если он существует. Команда :ничего не делает (почти )и может быть удалена. Значение переменной iterследует использовать как $iterи заключать в кавычки. И затем я, возможно, выражаюсь более явно, чем нужно, используя ./, чтобы сказать, что файл должен быть найден в текущем каталоге.

Если вы планируете превратить это в цикл (здесь, удалив все файлы 1.txt, 2.txt,...,10.txt):

iter=1
while [ "$iter" -le 10 ]; then
    if [ -f "./$iter.txt" ]; then
        rm "./$iter.txt"
    fi
    iter=$(( iter + 1 ))
done

Или, если мы чувствуем себя подлыми/ленивыми,

rm -f {1..10}.txt

в оболочках, понимающих раскрытие скобок.

1
08.11.2019, 16:48
2 ответа

Я думаю, это из-за слишком общего шаблона. Обычно утилиты командной строки выводят ошибки в stderr или терминал. Они не должны попасть в выходной файл.

0
27.01.2020, 23:40

Если вы grepпропинговали xmlфайлы таким образом, ваш поиск вернет всю строку, содержащую строку поиска, и, если в файле xmlнет новых строк, все содержимое файла. Довольно много «другого» в 10M файлах.

В соответствии с комментарием @Kusalananda не рекомендуется выполнять перебор xmlс помощью grepи синтаксического анализатора xml, например. Однако xmllint— лучший инструмент, если вы настаиваете......

Отметьте manдля grepи ознакомьтесь с параметром -o, чтобы ограничить возвращаемое значение и использовать regex, который определяет всю длину совпадения, которое вы ищете.

Если usernameявляется атрибутом

grep -o 'username="[^"]*"'

Или лучше

xmllint --xpath "//@username"

Если usernameявляется узлом, то что-то вроде

grep -o "username>[^<][^<]*"

Или лучше

xmllint --xpath "//username"

Для любого из запросов xmllintпросто оберните запрос в string(), чтобы извлечь атрибут или текст узла.

xmllint --xpath "string(//username)"
xmllint --xpath "string(//@username)"
0
27.01.2020, 23:40

Теги

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