Ответы пользователя по тегу bash
  • Как написать на bash программу (исполнимый файл), которая меняет каталог?

    @abcd0x00
    Как же написать программу, меняющую текущий каталог (если это возможно О_о)?


    #!/bin/bash
    
    cd /
    
    echo "I'm in `pwd`"
    
    bash
    
    exit 0
    Ответ написан
  • Как остановить вывод команды через BASH?

    @abcd0x00
    [guest@localhost ~]$ func() { while true; do echo a; echo b; sleep 5; done; }
    [guest@localhost ~]$ func | head -2
    a
    b
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • В файл1 удалить строки из файл2?

    @abcd0x00
    Как в файл1 содержащим строки вида почта:имя:фамилия:возраст удалить те строки которые содержатся в файл2 где указана просто почта

    grep -f file2.txt -v file1.txt >output.txt
    Ответ написан
    Комментировать
  • Как сделать выборку, со строгим GREP по нескольким линиям?

    @abcd0x00
    Здесь делал то же самое
    Как правильно написать скрипт на Bash?

    text="\
    1 London Paris |I am the Rock|
    2 Moscow Kyiv |I am the Cena|
    3 Kharkiv Dnepr |I am the CM Punk|
    4 Ottava Amsterdam |I am the Rock|
    5 Oslo New-Yourk |I am the Rock|
    6 Lviv Varshava |I am the Cena|
    7 Berlin Rome |I am the CM Punk|
    8 Moscow Oslo |I am the Cena|
    9 Kharkiv Kyiv |I am the Brock Lesnar|
    "
    
    
    fsm()
    {
        awk '{
            switch (state) {
            case 0:
                if (/Rock/) {
                    out = $0
                    state = 1
                }
                break
            case 1:
                if (/Rock/) {
                    out = $0;
                } else if (/Cena/) {
                    out = out"\n"$0
                    state = 2
                } else {
                    out = ""
                    state = 0
                }
                break
            case 2:
                if (/Punk/) {
                    out = out"\n"$0
                    print out
                    out = ""
                    state = 0
                } else {
                    out = ""
                    state = 0
                }
                break
            }
        }'
    }
    
    echo "$text" | fsm


    Вывод
    [guest@localhost tmp]$ echo "$text" | fsm
    1 London Paris |I am the Rock|
    2 Moscow Kyiv |I am the Cena|
    3 Kharkiv Dnepr |I am the CM Punk|
    5 Oslo New-Yourk |I am the Rock|
    6 Lviv Varshava |I am the Cena|
    7 Berlin Rome |I am the CM Punk|
    [guest@localhost tmp]$
    Ответ написан
    Комментировать
  • Как правильно написать скрипт на Bash?

    @abcd0x00
    Через конечный автомат
    text="\
    abc1
    abc2
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user changed password| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged off| -
    def1
    def2
    Mon, 1 Aug 2012 00:15:00 +xxxx|1.1.1.1|dnepr2| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user changed password| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged off| -
    ghi1
    ghi2
    "
    
    fsm()
    {
        awk '{
            switch (state) {
            case 0:
                if (/user logged in/) {
                    out = $0
                    state = 1
                }
                break
            case 1:
                if (/user logged in/) {
                    out = $0;
                } else if (/user changed password/) {
                    out = out"\n"$0
                    state = 2
                } else {
                    out = ""
                    state = 0
                }
                break
            case 2:
                if (/user logged off/) {
                    out = out"\n"$0
                    print out
                    out = ""
                    state = 0
                } else {
                    out = ""
                    state = 0
                }
                break
            }
        }'
    }
    
    echo "$text" | fsm


    Вывод
    [guest@localhost tmp]$ echo "$text" | fsm
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user changed password| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged off| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged in| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user changed password| -
    Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged off| -
    [guest@localhost tmp]$
    Ответ написан
    Комментировать
  • Как правильно поступить с датой?

    @abcd0x00
    Сначала переделай это
    get_proxy_list() {
      savefile=~/.PROXY_LIST
      date=$(date +%d.%m.%Y)
      url="http://site.com/proxy/list_${date}.txt"
    
      ...
    
    }


    В это
    make_dmy_date() {
        date "+%d.%m.%Y"
    }
    
    make_proxy_url() {
        echo "http://site.com/proxy/list_$(make_dmy_date).txt"
    }
    
    make_proxy_ofname() {
        echo "~/.PROXY_LIST"
    }
    
    get_proxy_list() {
      url=$1
      savefile=$2
    
      ...
    
    }
    
    get_proxy_list `make_proxy_url` `make_proxy_ofname`


    А потом уже пиши функции, какие нужно. Если нужно декрементировать дату, пиши для этого функцию. Заодно внутри функции идёт контроль над кодом, но и сам код может получиться нетривиальным, так как при декременте даты нужно учитывать, что она может дойти до нуля и это нужно будет тоже обкладывать кодом каким-то.

    А если всё в куче писать, то будет вот такая свалка, как у тебя сейчас, - неповоротливая и непригодная для каких-то тонких изменений и настройки.
    Ответ написан
    8 комментариев
  • Что тормозит загрузку?

    @abcd0x00
    Кто может подсказать в какую сторону копать, какие журналы посмотреть?

    Журналы загрузки и сообщений. Но для начала нужно просто в консоль войти изначально и посмотреть, есть ли в ней тормоза. Чтобы в консоль зайти, нужно к ядру в загрузчике присоединить число 3. То есть надо просто локализовать проблему, разделив область анализа дихотомически. Если проблема возникает и без графики, то в графике можно не искать решение. А если проблема возникает только при графике, то можно не искать решение в каких-то базовых, консольных процессах.
    Ответ написан
    Комментировать
  • Как в bash обработать кучу строк?

    @abcd0x00
    и как дальше работать с $temp ?

    echo "$temp" | что-то работает дальше

    Пример
    [guest@localhost ~]$ text=$(head -3 /etc/passwd)
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$text"
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$text" | grep oo
    root:x:0:0:root:/root:/bin/bash
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • Bash скрипт поиска русских слов?

    @abcd0x00
    Вообще, делают функцию _() и все фразы пишут на английском типа _("hello"). А сама эта функция уже идёт куда надо и берёт фразу на правильном языке в соответствии с локалью. Таким образом программа переводится на любой язык путём редактирования таких файлов с парами (английская, китайская).
    Ответ написан
  • Как найти и заменить второе вхождение?

    @abcd0x00
    text="\
    abc
    hello: \"\"
    def
    hello: \"\"
    ghi
    hello: \"\"
    jkl
    hello: \"\"
    mno\
    "
    
    echo "$text"
    
    echo "$text" | sed '
      /hello: ""/ {
        x
        /^\.$/ {
          x
          s/""/"world"/
          x
        }
        s/^/./
        x
      }
    '


    Вывод
    [guest@localhost sh]$ text="\
    > abc
    > hello: \"\"
    > def
    > hello: \"\"
    > ghi
    > hello: \"\"
    > jkl
    > hello: \"\"
    > mno\
    > "
    [guest@localhost sh]$ 
    [guest@localhost sh]$ echo "$text"
    abc
    hello: ""
    def
    hello: ""
    ghi
    hello: ""
    jkl
    hello: ""
    mno
    [guest@localhost sh]$ 
    [guest@localhost sh]$ echo "$text" | sed '
    >   /hello: ""/ {
    >     x
    >     /^\.$/ {
    >       x
    >       s/""/"world"/
    >       x
    >     }
    >     s/^/./
    >     x
    >   }
    > '
    abc
    hello: ""
    def
    hello: "world"
    ghi
    hello: ""
    jkl
    hello: ""
    mno
    [guest@localhost sh]$

    Ответ написан
    5 комментариев
  • Господа, пoсоветуйте книги по созданию bash скриптов и по регуляркам?

    @abcd0x00
    Скрипты в Bash
    Это вообще сайт с руководствами
    tldp.org/guides.html
    Это ABSG (Advanced Bash-Scripting Guide)
    tldp.org/LDP/abs/html/index.html
    ABSG тебе уже дали на русском.

    Регулярные выражения
    Тут на питоне
    getpython3.com/diveintopython3/regular-expressions.html
    https://docs.python.org/3/howto/regex.html#regex-howto
    Ещё книжка есть
    "Mastering Regular Expressions" Jeffrey Friedl
    Ответ написан
    Комментировать
  • Как в консоли сделать замену подстрок в Linux?

    @abcd0x00
    func()
    {
        cat <<EOF
    int i;
       cout << "hello!" << endl;
       printf("%s", "hello");
       printf("%s", "world");
    EOF
    }
    
    func
    
    func | sed '/hello/ s%^%//%'


    [guest@localhost sh]$ func()
    > {
    >     cat <<EOF
    > int i;
    >    cout << "hello!" << endl;
    >    printf("%s", "hello");
    >    printf("%s", "world");
    > EOF
    > }
    [guest@localhost sh]$ 
    [guest@localhost sh]$ func
    int i;
       cout << "hello!" << endl;
       printf("%s", "hello");
       printf("%s", "world");
    [guest@localhost sh]$ 
    [guest@localhost sh]$ func | sed '/hello/ s%^%//%'
    int i;
    //   cout << "hello!" << endl;
    //   printf("%s", "hello");
       printf("%s", "world");
    [guest@localhost sh]$
    Ответ написан
    Комментировать
  • Как передать данные в выполняемый скрипт?

    @abcd0x00
    echo "abc" | script.py
    Ответ написан
    Комментировать
  • Как редактировать конфигурационные файлы в Linux?

    @abcd0x00
    Каждая программа сама определяет свой формат файлов. Это могут быть как общие форматы вроде xml, json, yaml, так и самодельные форматы, в которых свои понятия переменных (могут быть похожи на bash'овский, а могут и не быть).
    Ответ написан
    Комментировать
  • Как указать несколько условий с логическим ИЛИ для if, которые содержат *?

    @abcd0x00
    #!/bin/bash
    
    test_parameter()
    {
        echo "$1" | grep -q '\(video\|audio\|pic\)\*'
    }
    
    if ! test_parameter "$1"; then
        echo error
    else
        echo success
    fi
    
    exit 0


    Вывод
    [guest@localhost sh]$ ./t.sh video
    error
    [guest@localhost sh]$ ./t.sh video*
    success
    [guest@localhost sh]$ ./t.sh audio
    error
    [guest@localhost sh]$ ./t.sh audio*
    success
    [guest@localhost sh]$ ./t.sh x
    error
    [guest@localhost sh]$


    Ещё вариант (всё на функциях)
    #!/bin/bash
    
    error()
    {
       echo "error: $1" 1>&2
    }
    
    ok()
    {
       echo "success: $1" 1>&2
    }
    
    test_parameter()
    {
        echo "$1" | grep -q '\(video\|audio\|pic\)\*'
    }
    
    main()
    {
        if ! test_parameter "$1"; then
            error "incorrect parameter: \"$1\""
        else
            ok "parameter is correct"
        fi
    }
    
    main "$@" || exit 1
    
    exit 0


    Вывод
    [guest@localhost sh]$ ./t.sh 
    error: incorrect parameter: ""
    [guest@localhost sh]$ ./t.sh video
    error: incorrect parameter: "video"
    [guest@localhost sh]$ ./t.sh video*
    success: parameter is correct
    [guest@localhost sh]$ ./t.sh audio
    error: incorrect parameter: "audio"
    [guest@localhost sh]$ ./t.sh audio*
    success: parameter is correct
    [guest@localhost sh]$ ./t.sh pic
    error: incorrect parameter: "pic"
    [guest@localhost sh]$ ./t.sh pic*
    success: parameter is correct
    [guest@localhost sh]$ ./t.sh x
    error: incorrect parameter: "x"
    [guest@localhost sh]$
    Ответ написан
    5 комментариев
  • Как получить переменные BASH их TXT файла?

    @abcd0x00
    getlineno()
    {
        sed -n "$2{p;q}" "$1"
    }
    
    username=`getlineno datafile.txt 2`
    password=`getlineno datafile.txt 3`
    database=`getlineno datafile.txt 1`
    
    sudo mysqldump -u$username -p$password $database > $database.sql
    
    unset password username database
    Ответ написан
    Комментировать
  • Как обработать файл со ссылками с помощью bash?

    @abcd0x00
    Важно определять каталоги для сохранения разрешений видео прямо из ссылок, иначе через полгода на vk введут какое-нибудь новое разрешение и твой скрипт не заметит его.
    #!/bin/bash
    
    get_url()
    {
        echo "$1"
    }
    
    get_subdir()
    {
        echo "$1" | sed 's/.*\.\([0-9]*\)\.mp4$/\1/'
    }
    
    main()
    {
        ifname="links.txt"
        odir="videos"
        ofname="links.txt"
    
        [ ! -d "$odir" ] && mkdir "$odir"
        cat "$ifname" | while read line; do
            ourl=`get_url "$line"`
            osubdir=`get_subdir "$line"`
            [ ! -d "$odir/$osubdir" ] && mkdir "$odir/$osubdir"
            opath="$odir/$osubdir/$ofname"
            echo "$ourl" >> "$opath"
        done
    }
    
    main "$@" || exit 1
    
    exit 0
    Ответ написан
    Комментировать
  • Как правильно экранировать строку для sed?

    @abcd0x00
    [guest@localhost ~]$ s='hello allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> hello'
    [guest@localhost ~]$ 
    [guest@localhost ~]$ src='allow="127\\\.\\d+\\\.\\d+\\\.\\d+|::1|0:0:0:0:0:0:0:1" />'
    [guest@localhost ~]$ dst='allow="^.\\*$" />'
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$s"
    hello allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> hello
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$src"
    allow="127\\\.\\d+\\\.\\d+\\\.\\d+|::1|0:0:0:0:0:0:0:1" />
    [guest@localhost ~]$ 
    [guest@localhost ~]$ echo "$dst"
    allow="^.\\*$" />
    [guest@localhost ~]$
    [guest@localhost ~]$ echo "$s" | sed "s%$src%$dst%g"
    hello allow="^.\*$" /> hello
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • Проблемы с mv, вызываемым из скрипта?

    @abcd0x00
    Вот тебе пример, как это делается обычно.

    Находишь нужные файлы, а потом sed'ом составляешь команду (одну или несколько) с ними. Когда команда готова, передаёшь её по каналу на sh.
    Код
    [guest@localhost t]$ ll
    итого 4
    -rw-rw-r--. 1 guest guest    0 сен 30 13:08 a a.txt
    -rw-rw-r--. 1 guest guest    0 сен 30 13:06 a.txt
    -rw-rw-r--. 1 guest guest    0 сен 30 13:06 b.txt
    -rw-rw-r--. 1 guest guest    0 сен 30 13:06 c.txt
    drwxrwxr-x. 2 guest guest 4096 сен 30 13:19 d
    [guest@localhost t]$
    [guest@localhost t]$ ls
    a a.txt  a.txt  b.txt  c.txt  d
    [guest@localhost t]$ 
    [guest@localhost t]$ files=$(find -name '*.txt')
    [guest@localhost t]$ 
    [guest@localhost t]$ echo "$files" | sed 's/.*/mv "&" d/'
    mv "./b.txt" d
    mv "./a.txt" d
    mv "./c.txt" d
    mv "./a a.txt" d
    [guest@localhost t]$ 
    [guest@localhost t]$ echo "$files" | sed 's/.*/mv "&" d/' | sh
    [guest@localhost t]$ 
    [guest@localhost t]$ ls
    d
    [guest@localhost t]$ ls d
    a a.txt  a.txt  b.txt  c.txt
    [guest@localhost t]$
    [guest@localhost t]$ ll d
    итого 0
    -rw-rw-r--. 1 guest guest 0 сен 30 13:08 a a.txt
    -rw-rw-r--. 1 guest guest 0 сен 30 13:06 a.txt
    -rw-rw-r--. 1 guest guest 0 сен 30 13:06 b.txt
    -rw-rw-r--. 1 guest guest 0 сен 30 13:06 c.txt
    [guest@localhost t]$

    Ответ написан
    Комментировать
  • Как вывести строку после определенного знака?

    @abcd0x00
    sed -n 's/ncore=//p' /opt/aliases.conf
    Ответ написан
    Комментировать