как проверить, содержит ли первая строка файла определенную строку? [дубликат]

Вам не нужно включать или устанавливать пароли, и вам действительно не нужно, если вы уже используете надежные ключи. Просто повторно заблокируйте свою учетную запись (sudo passwd -l username) из существующего сеанса и исправьте конфигурацию SSH.

Причина, по которой это произошло, вероятно, связана с тем, что вы изменили одну из настроек демона SSH по умолчанию (в / etc / ssh / sshd_config).

Измените это в / etc / ssh / sshd_config и перезапустите SSH:

UsePAM yes

В общем, если у вас нет действительно веских причин для отключения PAM, я рекомендую оставить его включенным; включение PAM в SSH позволит вам по-прежнему входить в систему, даже если пароль удален. Что бы вы ни делали, не устанавливайте пустой пароль или что-то подобное ... блокировка поля пароля не обязательно означает блокировку всей вашей учетной записи.

Совет при использовании SSH: держите другой сеанс открытым (в другом окне) всякий раз, когда вносите изменения в конфигурацию SSH, а затем проверьте, можете ли вы войти в систему; если вы случайно нарушите свой доступ, воспользуйтесь текущим сеансом, чтобы исправить это.

(Отказ от ответственности: я работаю в Userify , который предоставляет программное обеспечение для управления ключами SSH.)

6
11.11.2018, 19:16
4 ответа
for file in *; do
  [ -f "$file" ] || continue
  IFS= read -r line < "$file" || [ -n "$line" ] || continue
  case $line in
    ("#include"*) printf '%s\n' "$file"
  esac
done

Чтобы напечатать содержимое файла вместо его имени, замените команду printfна cat < "$file".

Если ваш awkподдерживает расширение nextfileи вас не волнуют возможные побочные эффекты открытия не -обычных файлов:

awk '/^#include/{print substr(FILENAME, 3)}; {nextfile}'./*

Выше мы добавляем префикс ./, который затем удаляем в FILENAME, чтобы избежать проблем с именами файлов, содержащими символы =(или с файлом с именем-).

С помощью zshвы можете заменить ./*на ./*(-.), чтобы передавать только обычные файлы (или символические ссылки на обычные файлы, как для подхода [ -f... ]выше )к awk.

Или распечатать содержимое файла вместо имени:

awk 'FNR == 1 {found = /^#include/}; found'./*

(этот портативный ).

6
27.01.2020, 20:21

Легко проверить, начинается ли первая строка с #includeв (GNU и AT&T )sed:

sed -n '1{/^#include/p};q'   file

Или упрощенный (и совместимый с POSIX):

sed -n '/^#include/p;q'   file

Это будет иметь результат, только если файл содержит #includeв первой строке. Это нужно только прочитать первую строку, чтобы сделать проверку, так что это будет очень быстро.

Итак, цикл оболочки для всех файлов (с sed )должен быть таким:

for file in *
do
    [ "$(sed -n '/^#include/p;q' "$file")" ] && printf '%s\n' "$file"
done

Если в pwd есть только файлы (, а не каталоги ).

Если вам нужно напечатать все строки файла, подойдет решение, аналогичное первому опубликованному коду. (Версия GNU & AT&T):

sed -n '1{/^#include/!q};p'  file

Или, (BSD-совместимая версия POSIXfied):

sed -ne '1{/^#include/!q;}' -e p  file

Или:

sed -n '1{
           /^#include/!q
         }
         p
       '  file
16
27.01.2020, 20:21
for file in *
do
  [ -f "$file" ] && head -n 1 < "$file" | grep -q '^#include' && cat < "$file"
done

Учтите, что при включенной опции -qgrepзавершится с нулевым статусом даже в случае возникновения ошибки.

2
27.01.2020, 20:21

Этот вопрос является прекрасным примером, когда решения bash и sed довольно сложны, но задача может быть намного проще с помощью (GNU )awk:

gawk 'FNR==1 && /^#include/{print FILENAME}{nextfile}' *
0
27.01.2020, 20:21

Теги

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