'Безопасно' удалить внешний диск, когда это размонтировано.
Причина не могло бы быть безопасно просто, если программы не используют его, состоит в том, что ядро Linux действительно пишет кэширование. При означании, что, когда программа записала в диск, что данные не могли бы физически быть на диске, это могло все еще быть в памяти (если программа не использует fsync
или fdatasync
). Linux делает это для выполнения записей на диск в больших блоках, который оптимизирует пропускную способность.
При размонтировании файловой системы она удостоверяется, что никакие дальнейшие записи не могут быть выполненными к диску. Это также выполняет a sync
звоните, который гарантирует, что все кэшированные данные спугивают к диску.
Удалить в то время как
цикл и использовать расширение оболочки скобы, а также FNR
, встроенная awk
переменная:
awk 'FNR==2{print $0 > "output.dat"}' file{1..80}.dat
sed
будет достаточно:
sed -sn 2p file{1..80}.dat > output.dat
-s
нужно вывести 2-ю строку из каждого файла, иначе будет выведена только 2-я строка из первого файла.
Попробуйте использовать ifdown tap_test
и ifup tap_test
вместо ifconfig
.
Смысл в том, что если
сделать еще немного работы. ifconfig
голый минимум.
если ethX
использует конфигурационный файл и вызывает интерфейс с правильным IP-адресом и т.д.
ifconfig ethX up
запускает только интерфейс.
Пробовали ли вы использовать mget с соответствующими подстановочными знаками, например mget *. *
? В качестве альтернативы рассмотрим не FTP-решение, такое как scp
или rsync
.
Как насчет...
head -n 2 input.dat | tail -n 1 | awk
...
Пробовали ли вы использовать mget с соответствующими подстановочными знаками, например mget *. *
? В качестве альтернативы рассмотрим не FTP-решение, такое как scp
или rsync
.
Использование некоторых логических операторов (Начиная с @ jimmij)
grep -q «$ finding» information.txt
ведет себя как логический ответ (при обнаружении ничего не имеет возвращаемого состояния 0, в противном случае ненулевое).
grp -F -- «$ finding»...
поисковый текст вместо regexp (удалите его, если хотите
искать regexp - могут быть некоторые угрозы безопасности... (спасибо @ StephanChazelas))
read finding
if [ -z "$finding" ]; then
echo "You didn't enter anything"
else
grep -qF -- "$finding" information.txt && echo "found" || echo "not found"
fi
или даже
[ -z "$finding" ] &&
echo "nothing entered" ||
grep -qF -- "$finding" information.txt || echo "not found"
(хотя остерегайтесь, чтобы он также запускал второй grep
и/или echo
, если первый echo
не удался)
Edit 1 > пояснить grep -q...
Конечно.
В обычных ситуациях состояние возврата grep равно 0 (и только возвращает «не 0», если возникает ошибка (например, файл не найден))
grep -qF exp файл
«возвращает» 0 если он находит exp в файле, ошибка в противном случае ( grep -q exp файл
будет делать это, если exp
regexp был сопоставлен в файле
).
Это поведение можно использовать в операторах управления bash (if, elif, while, & &, | |, etc)
read f
if [ -z "$f" ]; then
echo "You didn't enter anything"
elif grep -qF -- "$f" information.txt; then
echo "found"
else
echo "not found"
fi
-121--97763- арагаер sed
решение является самым хорошим, да. Но поскольку я получаю удовольствие от резания head 'tail
, у меня есть решение head' tail
, которое поддерживает несколько файлов, а не только один input.dat
. Использование цикла for вместо передачи списка файлов в sed также облегчает выполнение других операций с файлом до/после извлечения второй строки с sed.
# empty output.dat first
rm output.dat
# have a one-liner
for file in *.dat; do head -2 $file | tail -1 >> output.dat; done
Многострочная версия с исчерпывающим комментарием:
NB: будет выполняться следующий код. После |
, & &
или |
мы можем установить линейную линию и продолжить выполнение команды на следующей строке; мы даже можем размещать комментарии между ними. Я провел лет , не зная этого (и нигде не видя). Этот стиль менее полезен в интерактивном запросе, но очищает файлы сценариев без конца.
# empty output.dat first
rm output.dat
for file in *.dat; do
# file -> lines 1 and 2 of file
head -2 $file |
# lines 1 and 2 of file -> line 2 of file >> appended to output.dat
tail -1 >> output.dat
done
, очевидно, есть много способов сделать это - я думаю, что мне нравится @ Aragaer's Sed Actions лучше всего .
Вот тот, который использует чисто Bash Shotins и не нужно вилять любые внешние утилиты:
for f in file{1..80}.dat; do
{ read && read && printf "%s\n" "$REPLY"; } < "$f"
done > output.dat
Для эффективного использования awk
и sed
в ответах здесь на несколько файлов лучше использовать оператор nextfile
, чтобы пропустить обработку нежелательных строк в awk
.
awk 'FNR==2{ print >"output.dat"; nextfile}' infile{1..80}.dat
и с помощью sed
мы можем выйти при обработке на 3 й строке, и sed
будет обрабатывать следующий файл.
sed -sn '2p;3q' infile{1..80}.dat > output.dat