Как использовать AWK для выбора имени файла в URL?

pkill имеет параметры --ns pidи --nslist name..., которые можно использовать для ограничения пространств имен, на которые повлияет уничтожение.

--ns pidхорошо сочетается с bash, встроенным -в переменную $$, которая равна PID текущей оболочки.

Например, в одной из моих систем я запускаю экземпляр gitlab в докере, и одной из служб, которые он запускает в этом контейнере, является redis:

# ps u -C redis-server
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
997      30006  0.1  0.0  35504  2896 ?        Ssl  16:05   0:00 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0

Обратите внимание на PID, 30006.

Если я использую опцию -ns $$pkill, то это не будет kill, потому что она находится в пространстве имен, отличном от моей оболочки. Обратите внимание, что PID не изменился -, это указывает на то, что он не был убит и перезапущен.

# pkill --ns $$ redis-server
# ps u -C redis-server
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
997      30006  0.1  0.0  35504  2896 ?        Ssl  16:05   0:00 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0

Если я не использую эту опцию, то (неудивительно, что )она будет уничтожена.

# pkill redis-server
# ps u -C redis-server
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
997        459  0.5  0.0  35504  2896 ?        Ssl  16:11   0:00 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0

PID сервера redis -теперь равен 459. Он был остановлен и перезапущен.

Кстати, pgrepподдерживает те же параметры, поэтому легко получить список других процессов в тех же пространствах имен. например. pgrep -a --ns 459показывает мне все процессы, работающие в том же пространстве имен, что и сервер redis -выше.


psтакже имеет различные параметры выходного формата для отображения сведений о пространстве имен. Например:

# ps -o pidns,pid,cmd -C redis-server
     PIDNS   PID CMD
4026532661   459 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0

Изman ps:

pidns PIDNS

Unique inode number describing the namespace the process belongs to. See namespaces(7).

4
26.09.2019, 16:17
2 ответа

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

$ cat tst.awk
BEGIN {
    print "<table>"
    print "\t<thead>"
    print "\t\t<tr>"
    print "\t\t\t<th>ver</th>"
    print "\t\t\t<th>link</th>"
    print "\t\t</tr>"
    print "\t</thead>"
    print "\t<tbody>"
}

match($0, /^ +(.*): (.*\/([^/]+))$/, r) {
    print "\t\t<tr>"
    printf "\t\t\t<td>%s</td>\n", r[1]
    printf "\t\t\t<td><a href=\"%s\">%s</a></td>\n", r[2], r[3]
    print "\t\t</tr>"
}

END {
    print "\t</tbody>"
    print "</table>"
}

.

$ awk -f tst.awk data.text
<table>
        <thead>
                <tr>
                        <th>ver</th>
                        <th>link</th>
                </tr>
        </thead>
        <tbody>
                <tr>
                        <td>1.0.1</td>
                        <td><a href="http://example.com/1.0.1.tgz">1.0.1.tgz</a></td>
                </tr>
                <tr>
                        <td>1.0.2</td>
                        <td><a href="http://example.com/1.0.2.tgz">1.0.2.tgz</a></td>
                </tr>
                <tr>
                        <td>1.0.3</td>
                        <td><a href="http://example.com/1.0.3.tgz">1.0.3.tgz</a></td>
                </tr>
                <tr>
                        <td>1.0.4</td>
                        <td><a href="http://example.com/1.0.4.tgz">1.0.4.tgz</a></td>
                </tr>
                <tr>
                        <td>1.0.5</td>
                        <td><a href="http://example.com/1.0.5.tgz">1.0.5.tgz</a></td>
                </tr>
                <tr>
                        <td>1.0.6</td>
                        <td><a href="http://example.com/1.0.6.tgz">1.0.6.tgz</a></td>
                </tr>
                <tr>
                        <td>1.0.7</td>
                        <td><a href="http://example.com/1.0.7.tgz">1.0.7.tgz</a></td>
                </tr>
                <tr>
                        <td>1.0.8</td>
                        <td><a href="http://example.com/1.0.8.tgz">1.0.8.tgz</a></td>
                </tr>
                <tr>
                        <td>1.0.9</td>
                        <td><a href="http://example.com/1.0.9.tgz">1.0.9.tgz</a></td>
                </tr>
                <tr>
                        <td>1.0.10</td>
                        <td><a href="http://example.com/1.0.10.tgz">1.0.10.tgz</a></td>
                </tr>
        </tbody>
</table>
1
27.01.2020, 20:57

Попробуйте это в строке № 18.

printf "\t\t\t<td><a href=\"%s\">%s.tgz</a></td>\n", r[2], r[1]
2
27.01.2020, 20:57

Теги

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