Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Рекурсивно найти файлы в заданном каталоге содержащие заданную строку

Написать скрипт для поиска заданной пользователем строки во всех файлах заданного каталога и всех его подкаталогов (строка и имя каталога задаются пользователем в качестве первого и второго аргумента командной строки). На консоль выводятся полный путь и имена файлов, в содержимом которых присутствует заданная строка, и их размер. Если к какому либо каталогу нет доступа, необходимо вывести соответсвующее сообщение и продолжить выполнение.
Ответ:
Bash
1
readlink -m $(grep -lrF 'строка' /dir_name)
Вопрос: Обработать текстовый файл в Терминале

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

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
Вопрос: Копирование файлов с датой, заданной аргументом

Как можно сделать так, чтобы приложение позволяло копировать все файлы не позже времени, установленного аргументом при вызове скрипта?
Ответ:
Сообщение от Nicekun
файлы не позже времени
хоть перечитывайте что Вы пишите.
Bash
1
man find
Вопрос: Записать в файл содержимое директории, найти строку(и) содержащие cron

В файл list.txt записать список файлов директории /var/log. На экран вывести номер знако-мест, в которых стоит строка con


Начал так но на самом деле затрудняюсь, что делать дальше
Bash
1
grep -E -r- h /var/log/* > list.txt 
Ответ:
Сообщение от Jokez
В файл list.txt записать список файлов директории /var/log. На экран вывести номер знако-мест, в которых стоит строка con
Bash
1
ls /var/log > list.txt && grep -n "con" list.txt
Вопрос: Найти строку во всех файлах заданного каталога и всех его подкаталогах

Написать скрипт для поиска заданной пользователем строки во всех файлах заданного каталога и всех его подкаталогах (строка и имя каталога задаются пользователем в качестве первого и второго аргумента командной строки). На консоль выводятся полный путь и имена файлов, в содержимом которых присутствует заданная строка, и их размер. Если к какому-либо каталогу нет доступа, необходимо вывести соответсвующее сообщение и продолжить выполнение.
Ответ: Вообще то по условию задания надо поменять местами позиционные параметры
Первым параметром должна идти строка, а вторым директория, но за ошибку я думаю
это считаться не должно
Bash
1
wc -c $(grep -rl "$2" $(cd $1; pwd))
Вопрос: Найти в текущем каталоге файл с заданным именем

Помогите пожалуйста написать скрипт очень прошу!

Разработать программу, отыскивающую в текущем каталоге файл с заданным именем. Имя искомого файла вводится в командной строке. Если файл существует, вывести подробную информацию о нём на экран. Если файл не существует, то он создается и в него записывается текущее время.
Ответ:
Bash
1
2
3
4
5
#!/usr/bin/env bash
#filename shur.sh
read -p "Введите имя файла: " var 
find ./ -maxdepth 1 -type f -name "$var" -exec stat {} \;
[[ -f "$var" ]] || echo -n $(date +%F_%X) > "$var"
Вопрос: В файле выбрать все строки, в которых значение 3-го столбца меньше 20

Привет всем!)
Помогите пожалуйста! Нужно в файле qwery3 выбрать все строки, в которых значение 3-го столбца меньше 20.
Файл qwery3:
Ответ:
Код Code
1
cat qwery3.txt |awk 'BEGIN {FS="!"}{if (NF>1) {if ($4 < 20) {print $0}}}'
Вопрос: Программа для чтения строки

Привет.
Нужна программа, чтобы переходила в директорию и запустила файл. И потом прочитать строку ( генерируется текст на 8 строке после символов // ) и что бы она скопировала его. Потом открыла ещё 1 консоль и прописала там команду через sudo и выбрала пункты ( 1;2;:3;2 и вставила скопированный текст ) . Я без понятия как это реализовать, но очень надо. Помогите.
Ответ: Чем полнее Вы опишите проблему тем квалифицированнее и точнее будет ответ. Есть ли ссылки до 8 строки? Чем они могут отличаться от ссылке в 8 строке? Каков формат самой строки? И т.д. Самое простой путь прописан у меня в подписи. А так только общий пример (и не факт что рабочий)
Bash
1
./ngrok hhtp -l 80 | head -8 | tail -1 | grep -o "https\?://.*"
Вопрос: Наличие файла в каталогах, заданных через параметры

Проверить существует ли в каталогах, заданных через параметры при вызове сценарии, файл. Имя файла вводится с клавиатуры
Ответ:

Не по теме:

Проверяйте! Можно.

Вопрос: Удаление полностью идентичных (дублирующихся строк) при использовании sed

Вот исходный текст, перед некоторыми строками используется знак табуляции, а некоторые используют символы пробела.
Обозначу для примера строки со знаком табуляции

Кликните здесь для просмотра всего текста
\tworkgroup = WORKGROUP
\tworkgroup = WORKGROUP
\tworkgroup = WORKGROUP

workgroup = WORKGROUP
workgroup = WORKGROUP33
workgroup = WORKGROUP22
workgroup= WORKGROUP
workgroup=WORKGROUP22

Интересное предположение

\tsamba = SAMBA
\tsamba = SAMBA
work = ws-1



Написал небольшую функцию по удалению похожих строк в конфигурационном файле, но полностью идентичные строки не получается удалить

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env bash
 
# удаление повторяющихся строк
 
file=./smb2.conf
 
function delete_duplicate_str(){
dub=$(sort $file | uniq -d)
 
 if  [[ -n "${dub}"  ]] 
 then
 echo
 echo -e  "Найдены идентичные строки :\n ${dub}"
 echo
local et=$1
local et2=$2
#reg=$(grep -Px "\t${et} = .*" $file)
duplicate_1=$(grep -Px "^\t${et}\s=\s${et2}$" $file)
duplicate_2=$(grep -Px "^\t${et}\s=.*$" $file)
 
      if [[ -n "${duplicate_1}" ]]
    then
        echo
        echo  -e "Найдено полностью идентичных совпадений опций по умолчанию:\n ${duplicate_1} "
        echo
        echo -e "Удалим только похожие совпадения "
       sed -i -r "/${et}\s*=/{/^\t${et}\s= \b${et2}\b/! d}" $file
   else
       echo "совпадений не найдено"
      #sed -i -r "/${et}\s*=/{/^\tw.* = \b${et2}\b/! d}" $file
      fi
 else
     echo "совпадений нет"
 fi 
 
# -n -проверяет, что строка не пустая
}
 
 
 delete_duplicate_str "workgroup" "WORKGROUP" 
 
 # delete_duplicate_str "samba" "SAMBA"
 
 
 # local et=$1 
 # $1 - 1-й аргумент - это эталонное слово для поиска нужной опции
 # local et=$2 
 # $2 - 2-й аргумент - это эталонное слово для поиска значения
 # по умолчанию соответствующей опции
 # duplicate_1 - данная переменная содержит вычисляемое выражение - $(выражение)
 #  это выражение позволяет определить есть ли в данном файле опций со значениями по умолчанию
 # 
  # grep -Px - поиск слов с применением регулярных выражений
  # -P или --perl-regexp  - этот ключ, означает использование  ШАБЛОНа - регулярного выражения языка Perl
  # -x  -  поиск точного вхождения слова
  # ^ - якорь в регулярных выражениях, означает "начало строки"
  # \s - один пробельный символ
  # $  - якорь в регулярных выражениях, означает "конец строки"



Пробовал так

Bash
1
 delete_duplicate_str "workgroup" "WORKGROUP" < sed  "2,$d
или так

Bash
1
 delete_duplicate_str "workgroup" "WORKGROUP" | sed  "2,$d
Не работает.
Может ли утилита sed справиться с этой задачей ?
Ответ: Выкладываю честно стыренный где-то ранее (где не помню) мною код для удаления одинаковых строк, идущих не подряд.
Я не говорю что он элегантен или короток. Просто он у меня был

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/bin/bash
 
# определяет повторяющиеся строки в файле
# оставляет в файле только одну из повторяющихся строк
 
error()
{
    echo "error: $1" 1>&2
}
 
remdups()
{
    local fname=$1 tmpname
    
    tmpname=${fname}_
    
    if sort -u "$fname" > "$tmpname"; then
        mv -f "$tmpname" "$fname"
    else
        [ -f "$tmpname" ] && rm -f "$tmpname"
    fi
}
 
selfile()
{
    echo "Select file"
    n=0
    while true; do
        read -p "Enter: " fname
        ((n++))
        if [ -f "$fname" ]; then
            echo -n "Processing $fname... "
            remdups "$fname" && echo "ok"
            break
        elif [ $n -lt 3 ]; then
            error "no such file"
        else
            error "all names are wrong"
            break
        fi
    done
}
 
readfile()
{
    echo "Read file"
    n=0
    while true; do
        read -p "Enter: " fname
        ((n++))
        if [ -f "$fname" ]; then
            cat "$fname"
            break
        elif [ $n -lt 3 ]; then
            error "no such file"
        else
            error "all names are wrong"
            break
        fi
    done
}
 
cont=1
while [ $cont -eq 1 ]; do
    select ch in "Select" "List" "Read" "Exit"; do
        case "$ch" in
          "Select") selfile;;
          "List") ls;;
          "Read") readfile;;
          "Exit") cont=0; break;;
        esac 
    done
done
 
exit 0