Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Обработать текстовый файл в Терминале

Помогите сделать это в терминале

1. Создайте два файла с перечнем объектов (каждый объект с новой строки).
2. Отсортируйте каждый из файлов по алфавиту
3. Объедините эти файлы в один
4. Подсчитайте общее количество слов в нем,
5. Выведите на экран первые и последние две строки файла
6. Замените символы перевода строки на символ табуляции и обратно
7. Отсортируйте файл
8. Пронумеруйте строки файла
9. Выведите на экран все строки, содержащие букву "р"
10. Разбейте файл на три файла
Выполнить следующие задания. Объяснить каждый шаг конвейера. Вместо знаков вопроса подставьте нужную команду/аргумент.
1. Вывести на экран всех пользователей системы с сортировкой по алфавиту:
$ cut -d: -f1 /etc/passwd | ???

2. Изменить предыдущую команду таким образом, чтобы помимо имени пользователя на экране также выводился его идентификатор. Подсказка: посмотрите содержимое файла /etc/passwd, чтобы найти, в каком из полей, разделенных двоеточием, находится UID.
3. Подсчитать количество пользователей, у которых командой оболочкой является bash:
$ grep :/bin/bash /etc/passwd | wc -l

4. Вывести на экран всех пользователей, использующих командную оболочку /bin/bash, отсортировав их по алфавиту в обратном порядке:
$ grep :/bin/bash /etc/passwd | ??? | ???

5. Выполнить сортировку пакетов по размеру (большего к меньшему) и вывести первые 25 пакетов:
$ rpm -qa --qf '[%{NAME}: %{SIZE}\n]' | sort -rn -k2,2 | ???

6. Вывести все файлы из пакета man, подсчитать для каждого из них размер, игнорируя ошибки, и выполнить сортировку по размеру:
$ rpm -ql man | xargs -l du 2> /dev/null | sort -n

7. При помощи программы top вывести список работающих процессов и отсортировать их по имени процесса (аргумент команды sort заполнить самостоятельно):
$ top -b -n1 | sort ???

8. Используя команду awk, изменить вывод команды top таким образом, чтобы в первой колонке отображалось имя процесса, во второй - объём занимаемой памяти:
$ top -b -n1 | awk '{printf "%35s %s\n", $12, $6}'
9. Вывести файл /etc/passwd в отсортированном по пользователям виде, заменив знаки двоеточия пробелами:
$ ??? | tr ":" " "
10. Вывести файл /etc/passwd в отсортированном по пользователям виде в две колонки - в первой - имя пользователя, во второй - командная оболочка пользователя:
$ ??? | awk -F: '{printf "%15s %s\n", $1, $7}'
11. На примере файла user-manual.txt из документации git исследовать конвейеры.
$ cd /usr/share/doc/git-*
12. Выполнить анализ частоты появления каждого слова в файле user-manual.txt. Конвейер нужно строить по шагам, наблюдая за изменением результата. Определить этап получения первичной информации, этап обработки и этап представления результатов.
$ cat user-manual.txt | tr ' ' '\012' | tr '[:upper:]' '[:lower:]' | tr -d '[unct:]' | grep -v '[^a-z]' | sort | uniq -c | sort -rn | head -5
Или:
$ cat user-manual.txt | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -rn | head -5
Почему различаются результаты работы конвейеров?
13. Выполнить анализ частоты появления каждого символа.
$ tr '[:lower:]' '[:upper:]' < user-manual.txt | tr -d '[unct:] \n\t' | fold -w1 | sort | uniq -c | sort -rn | head -5
14. Вывести самые часто встречаемые слова, в которых количество символов больше семи:
$ tr -cs '[:alpha:]' '\n' < user-manual.txt | less | grep -E ........ | sort | uniq -c | sort -rn | head
Ответ: 1. Создайте два файла с перечнем объектов (каждый объект с новой строки).
2. Отсортируйте каждый из файлов по алфавиту
3. Объедините эти файлы в один
4. Подсчитайте общее количество слов в нем,
5. Выведите на экран первые и последние две строки файла
6. Замените символы перевода строки на символ табуляции и обратно
7. Отсортируйте файл
8. Пронумеруйте строки файла
9. Выведите на экран все строки, содержащие букву "р"
10. Разбейте файл на три файла
Выполнить следующие задания. Объяснить каждый шаг конвейера. Вместо знаков вопроса подставьте нужную команду/аргумент.
1. Вывести на экран всех пользователей системы с сортировкой по алфавиту:
Bash
1
$ cut -d: -f1 /etc/passwd | ??? 
2. Изменить предыдущую команду таким образом, чтобы помимо имени пользователя на экране также выводился его идентификатор. Подсказка: посмотрите содержимое файла /etc/passwd, чтобы найти, в каком из полей, разделенных двоеточием, находится UID.
3. Подсчитать количество пользователей, у которых командой оболочкой является bash:
Bash
1
$ grep :/bin/bash /etc/passwd | wc -l 
4. Вывести на экран всех пользователей, использующих командную оболочку /bin/bash, отсортировав их по алфавиту в обратном порядке:
Bash
1
$ grep :/bin/bash /etc/passwd | ??? | ??? 
5. Выполнить сортировку пакетов по размеру (большего к меньшему) и вывести первые 25 пакетов:
Bash
1
$ rpm -qa --qf '[%{NAME}: %{SIZE}\n]' | sort -rn -k2,2 | ??? 
6. Вывести все файлы из пакета man, подсчитать для каждого из них размер, игнорируя ошибки, и выполнить сортировку по размеру:
Bash
1
$ rpm -ql man | xargs -l du 2> /dev/null | sort -n 
7. При помощи программы top вывести список работающих процессов и отсортировать их по имени процесса (аргумент команды sort заполнить самостоятельно):
Bash
1
$ top -b -n1 | sort ???
8. Используя команду awk, изменить вывод команды top таким образом, чтобы в первой колонке отображалось имя процесса, во второй - объём занимаемой памяти:
Bash
1
$ top -b -n1 | awk '{printf "%35s %s\n", $12, $6}' 
9. Вывести файл /etc/passwd в отсортированном по пользователям виде, заменив знаки двоеточия пробелами:
Bash
1
$ ??? | tr ":" " " 
10. Вывести файл /etc/passwd в отсортированном по пользователям виде в две колонки - в первой - имя пользователя, во второй - командная оболочка пользователя:
Bash
1
$ ??? | awk -F: '{printf "%15s %s\n", $1, $7}' 
11. На примере файла user-manual.txt из документации git исследовать конвейеры.
Bash
1
$ cd /usr/share/doc/git-*
12. Выполнить анализ частоты появления каждого слова в файле user-manual.txt. Конвейер нужно строить по шагам, наблюдая за изменением результата. Определить этап получения первичной информации, этап обработки и этап представления результатов.
Bash
1
$ cat user-manual.txt | tr ' ' '\012' | tr '[:upper:]' '[:lower:]' | tr -d '[unct:]' | grep -v '[^a-z]' | sort | uniq -c | sort -rn | head -5 
Bash
1
2
Или: 
$ cat user-manual.txt | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -rn | head -5 
Почему различаются результаты работы конвейеров?
13. Выполнить анализ частоты появления каждого символа.
Bash
1
$ tr '[:lower:]' '[:upper:]' < user-manual.txt | tr -d '[unct:] \n\t' | fold -w1 | sort | uniq -c | sort -rn | head -5 
14. Вывести самые часто встречаемые слова, в которых количество символов больше семи:
Bash
1
$ tr -cs '[:alpha:]' '\n' < user-manual.txt | less | grep -E ........ | sort | uniq -c | sort -rn | head
Вопрос: Получение списка процессов

Народ помогите
Нужно написать скрипт для получения и записи в файл списка запущенных процессов(linux)
Кто может поделитесь кодом
Ответ:
Сообщение от Marinero
Чем не устроило Получение списка процессов
Огромное спасибо)
Помогло
Вопрос: Составить список всех слов входящих в текст и подсчитать кол-во вхождения каждого слова

Для заданного текстового файла составить список всех слов, входящих в этот текст, и подсчитать количество вхождений каждого слова. Результат выдать в порядке убывания количества вхождений.
Ответ:
Bash
1
2
3
4
5
<$1 tr ' \t' '\n' |   #заменяем пробелы на новую строку (= по 1 слову в строке)
tr -d '0-9.,:!?-' |   #убираем знаки препинания
sort |                #сортируем слова для след. команды (работает только с сортированным списком)
uniq -c |             #удаляем повторы и указываем количество повторений
sort -bnr             #сортируем по частоте (количеству повторов)
Добавлено через 27 минут
Bash
1
awk 'BEGIN{RS="[^a-zA-Z]+"}$0{A[$0]++}END{for(i in A)print A[i], i}' "$1" | sort -nr
Вопрос: Обработать и сравнить два списка

Все привет,
Решаю такую задачу : Файловый сервер, хотим видеть какие файлы были открыты.
Пытаюсь сделать так, массив из $result_list , разбираю лог journalctl и получаю список открытых файлов от определенного пользователя.
Далее сравниваю со списком из папки, при совпадение, переименовываю...

Проблемы то с пробелами в имени , например Лист Microsoft Excel.xlsx

то выводить название файла, пытался скормить список в while , done < $file

Подскажите куда копнуть?
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
user="test" 
log=/var/log/syslog 
dir=/mnt/data/folders/test/test
was_open=`date`
#result_list=`cut $log -d "|" -f1,3,5,6 | cut -d ":"  -f4 | sort -u | grep open | grep $user | awk -F "|" '{print $4}'` 
#file_list=`ls  $dir | sort`
clist=/home/foo/file
flist=/home/bar/file
 
for list1 in $clist ;
  do
   while read line;
    do
    if [ "$line" == "$list1" ] ;
     then
     `mv /$dir/$line /$dir/$was_open$line`
     echo "Попытка"
     else
     echo $clist
fi
     done < $flist
  done
Добавлено через 2 часа 8 минут
Прорабатываю такой скрипт
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
declare -a arr1
declare -a arr2
 
arr1=($result_list) 
arr2=($file_list)
 
for(($i=0; $i < count($arr1); $i++)) # тут что то я путаю
  do
  if [$arr1[$i] == $arr2];
   then
    echo "Равно"
    else 
    echo "Не равно"
     fi
done
Добавлено через 2 часа 9 минут
х



Привел вот к такому ввиду, что не так?
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 IFS="\n"
 
declare -a array1=( `cut /var/log/syslog -d "|" -f1,3,5,6 | cut -d ":"  -f4 | sort -u | grep open | grep test | awk -F "|" '{print $4}'` )
 
declare -a array2=( `cat ./flist` )
 
 
for i in  "${array1[@]}"
    do
for j in "${array2[@]}"
    do
    if [ "$i" == "j" ]
    then
    `'cp /mnt/data/filders/test/test/$i /mnt/data/forlders/test/test/copy$j'`
    echo "нашли"
    else
    echo "не то" 
   fi
done
done
Ответ: Идея хорошая, но там только изменения. Мне нужно фильтровать по пользователю.
Вопрос: Получить список субдиректорий и обработать его согласно правилу на C-SHELL

Добрый вечер, господа. Нужна очень-очень помощь по csh. Не успеваю за лабораторными, пока что еще не начал осваивать эту оболочку, а задание делать надо, рассчитываю на помощь знакотов! Задание «Командный файл, в котором просматриваются все подкаталоги текущего каталога и создаются два списка каталогов. Если в просматриваемом подкаталоге число файлов меньше 10, то список этих файлов со строкой- заголовком - полным именем подкаталога, дописывают в файл „Littlelist“ иначе - в „Biglist“.»
Ответ: Как на csh(сейчас он редко встречается) не знаю, но на bash
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#USAGE: ./script.name [path_to_dir] else will search in current dir
#check each SUBDIR in DIR for number of files
 
dir=${1:-.}
echo -n >little.list
echo -n >big.list
 
for subdir in "$dir/"*/
do
    if [ $(find "$dir/$subdir" -type f | wc -l) -lt 10 ]
    then
         echo "$subdir" >> little.list
    else
         echo "$subdir" >> big.list
    fi
done
Вопрос: Как можно проверить по списку файлы, на checksum?

Как можно проверить по списку файлы, на checksum? ну т.е. чтобы взять файлы например браузера google chrome и сравнить их с удаленным репозитарием на checksum, чтобы удостовериться что они не были модифицированы.

Это нужно чтобы удостовериться что не было вируса.

Кто что подскажет.
Ответ: Только если контрольные суммы прилагаются вместе с пакетом. Или если в удаленном
репозитории вы можете например выполнить команду md5sum.
Ну а что касается родных пакетов то в репозитории дебиан есть утилита debsums -c
может проверить все пакеты на наличие изменений контрольной суммы.
В rpm дистрах практически аналог rpm -Va
Вопрос: Как сравнить в bash выполнение двух команд

Как сравнить в bash выполнение двух команд

grep dat file_list.txt | wc -l и вот этой find /home/kushnira/FILE_DIR/OPTION_TL/ -type f -iname '*.dat*' | wc -l
?
Ответ: x17.mstu,

diff <(command1) <(command2)
Вопрос: Вывести нумерованный список параметров и сообщить о найденном в списке файле

Приветствую. Прошу помочь разобраться с программами.
1 - Вывод на экран списка параметров командной строки с указанием номера
каждого параметра.
8 - Циклический просмотр списка файлов и выдача сообщения при появлении
заданного имени в списке.

Что я делаю неправильно?
Ответ: 1/
Bash
1
./1 arg1 arg2
Bash
1
2
#!/bin/bash
printf "%s\n" "$@" | nl -w2 -s ' '
2/
Bash
1
2
type='*.txt'
name= …
Добавлено через 23 минуты
Bash
1
grep -Fqm 1 'fileMain' *.txt && echo found
Вопрос: Вывести список исполняемых файлов, которые могут быть выполнены текущим пользователем без указания пути к ним

Помогите, пожалуйста, вывести список исполняемых файлов, которые могут быть выполнены текущим пользователем без указания пути к ним. Так же список надо отсортировать по алфавиту в обратном порядке. Написал такой скрипт, но он выводит файлы, которые нельзя запустить без указания полного пути к ним.

Код Bash
1
2
3
4
5
#!/usr/bin/ksh
IFS=':'
set -A mas $PATH
 
find ${mas[@]} -perm -100 -type f | sed 's/^.*\///g' | sort -r
Ответ: попробовал использовать ключ executable
Код Bash
1
2
3
4
5
#!/usr/bin/ksh
IFS=':'
set -A mas $PATH
 
gfind ${mas[@]} -type f -executable -print | sed 's/^.*\///g' | sort -r
попробовал вывелись один из файлов, которые вывелись
результат на скрине..
Вопрос: Вывести список файлов начинающихся с символа 'q' с заходом в подкаталоги с сортировкой

здравствуйте
подскажите пожалуйста ка вывести список файлов каталога,начинающихся с символа 'q'.с заходом в подкаталоги.Список отсортировать по размеру файлов в порядке возрастания.
Подскажите,пжлс, как написать командой с помощью find.
И тут лучше команда find или ls использовать?
Ответ: Я этого не говорил
Сообщение от Marinero
find -name 'q*' -print0 | xargs -0 ls -1rS