LINUX.ORG.RU

Какие использовать команды?


0

0

Здрасти, не подскажете как это все сделать?

1. Посчитать количество пользователей в системе. (не в ручную и не считая кол-во строк файла passwd, должно явно вывести общее число пользователей).

2. Отсортировать список файлов текущей директории в обратном порядке и записать его в файл.

3. Посчитать количество файлов текущего каталога, содержащих подстроку «include».

4. Посчитать, сколько раз пользователь X вошел в систему.

5. Отсортировать список текстовых файлов текущей директории в алфавитном порядке и записать его в файл.

6. Удалить из текущего каталога все файлы, содержащие подстроку «text».

7. Объединить все файлы с расширением ".txt" в один файл.

8. Посчитать, сколько процессов запущено с данного терминала.

9. Вывести на экран отсортированный в алфавитном порядке список файлов, содержащих подстроку «include».


Решение лабораторных — в разделе Job.

x3al ★★★★★
()

Аргументы для команд найдёшь в man.

1) В общем случае нерешаемо простым скриптом. Число залогиненных сейчас посчитать можно, впрочем.

2) ls| tac>

3) find|while read; do grep -q&&echo '1'; done|wc -l

4) last|grep -c

5) for ; do file |grep -q 'text' && echo ; done > file

6) find|while read; do grep -q && rm ; done

7) cat >

8) Не тривиально, но скорее всего имеется в виду ps за вычетом самого ps

9) Смотри выше.

x3al ★★★★★
()
Ответ на: комментарий от Loompy

Ты посчитаешь число вхождений слова include, а не число файлов со словом. Если в файле несколько раз слово include, то твой вариант будет неверен.

grep -q include на_каждый_файл && echo <что угодно>, а потом уже wc -l выдаст нужный вариант. Как получить список файлов — побоку, но find -type f лучше, чем просто звёздочки если нужны вложенные каталоги. grep -q && echo — выдаёт ровно 1 строку на каждый файл.

find .-type f|while read i; do grep -q include "$i" && echo 1; done|wc -l

↑ примерно так.

x3al ★★★★★
()
Ответ на: комментарий от Loompy

Я же не писал аргументы.

who выдаёт залогиненных юзеров, если ты один — тебя и выдаст. Ты не можешь посчитать всех юзеров в общем случае потому, что «юзер» — широкое понятие. Не всегда они в /etc/passwd. Не всегда они в /home (может, это и имелось в виду?).

x3al ★★★★★
()
Ответ на: комментарий от x3al

да, так рабоатет, вывеk число файлов 3.

в одном из трех файлов было 10 раз слово include , grep -l include *|wc -l

---тоже выводил 3.

странно)

Loompy
() автор топика
Ответ на: комментарий от x3al

4. Посчитать, сколько раз пользователь X вошел в систему.

linux-6vhu:~/ # last root|wc -l

257

а так правильно будет?

Loompy
() автор топика
Ответ на: комментарий от x3al

есть 3 файла, в одном из них include раз 10 встречается.

find -type f|while read i; do grep -q include «$i» && echo 1; done|wc -l

ИЛИ

grep -l include *|wc -l

обе выдают результат 3. Второй вариант правильный?

Loompy
() автор топика
Ответ на: комментарий от Loompy

Оба правильные, я забыл про -l. Правда, второй вариант пропускает подкаталоги и файлы с именем .<что-нибудь>, но это можно исправить

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 1)
Ответ на: комментарий от Loompy

Как сломать башевые скрипты неочевидными вещами.

обе выдают результат 3. Второй вариант правильный?

Второй вариант сломается, если в имени файла есть перевод строки.

echo include > test$'\n'file
x3al ★★★★★
()

6. Удалить из текущего каталога все файлы, содержащие подстроку «text».

6) find|while read; do grep -q && rm && done

а какой синтаксист правильный то будет?

а такой вариант правильный?

linux-6vhu:~/ # rm -i `grep -l text *`

Loompy
() автор топика
Ответ на: комментарий от Loompy

С той же оговоркой о файлах с переводом строки в имени. Ну и

rm -i "`grep -l text *`"

если не хочешь, чтобы код ломался на банальном пробеле.

x3al ★★★★★
()
Ответ на: комментарий от x3al

ну если раассмотреть более правильный

for ; do file |grep -q 'text' && echo && done > file

то как тут доработать надо не подскажешь?

Loompy
() автор топика
Ответ на: комментарий от Loompy
for i in *; do file -b "$i"|grep -q 'text' && echo $i; done > file

Если с подкаталогами, то for i in **/* (не уверен, что баш так умеет, но zsh — вполне; игнорируются скрытые файлы, которые for i in **/.*) или find . -type f | while read i; вместо for. В любом случае всё ломается на определённых именах файлов, но мне лень писать защиту от этого.

Что делать со случаями, когда file сбоит (он изредка может детектировать юникодный текст как DOS COM file) — не представляю. Если в задании имелось в виду расширение — тогда проще.

Как-то так, наверно.

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 2)
Ответ на: комментарий от x3al

спасиб, думаю подходит этот вариант.

а на счет

6. Удалить из текущего каталога все файлы, содержащие подстроку «text».

6) find|while read; do grep -q && rm && done

как тут правильней будет?

Loompy
() автор топика
Ответ на: комментарий от x3al

в 3)

find -type f|while read i; do grep -q include «$i» && echo 1; done|rm –i

а как удалять то?

rm -i «`grep -l text *`»

а здесь ломаться будет при переводе строки?

Loompy
() автор топика
Ответ на: комментарий от x3al

а в 9) чтото вроде этого ?

ls -c `find -type f|while read i; do grep -q include «$i» && echo 1; done|wc –l`

linux-6vhu:~/ # ls -c `find -type f|while read i; do grep -q include «$i» && echo 1` bash: command substitution: line 2: syntax error: unexpected end of file textresult.txt file sort 3.txt 3 5.txt 5 4 2 2.txt

Loompy
() автор топика
Ответ на: комментарий от x3al

linux-6vhu:~/ # ls -c `grep -l include *`

textresult.txt 3.txt 3 5.txt

тут не все выводить будет?

Loompy
() автор топика
Ответ на: комментарий от x3al

а ка в 8) не считать сам ps?

и 9 тоже можешь подсказать?

Loompy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.