Передача по каналу в awk сценариях

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

То, когда fetchmail загружает локальную копию, что происходит с той копией, не отражается на стороне сервера.

Если Вы хотите вещи, Вы делаете к своей почте, которая будет отражена на сервере, то Вы не хотите использовать fetchmail. Вы хотите поддерживающий IMAP почтовый клиент, которого существуют многие для Linux. Похоже, что единственный клиент Linux, официально поддерживаемый Google, является Thunderbird, но другие клиенты, вероятно, будут работать также.

3
16.07.2012, 05:11
3 ответа

Я присоединюсь к другому совету, из которого Вы не должны анализировать вывод ls, таким образом, это - плохой пример. Но как более общий вопрос, я включал бы awk сценарий непосредственно в сценарий оболочки путем передачи его как аргумента awk.

#!/bin/bash
ls -lhF "$@" | awk '
    ( NF >= 9 ) {
        print "|-- [" $5 "] " $9
    }'

Обратите внимание на это, если awk сценарий должен включать ' (одинарная кавычка) символ, необходимо заключить его в кавычки: использовать '\'' (закройте одинарную кавычку, литеральную одинарную кавычку, открытую одинарную кавычку).

Чтобы избежать необходимости заключать в кавычки, можно использовать здесь документ вместо этого. Но это является неловким, потому что Вы не можете использовать стандартный вход и чтобы подать вход к awk и подать сценарий. Необходимо использовать дополнительный дескриптор файла (см. Когда Вы использовали бы дополнительный дескриптор файла? Дескрипторы файлов и сценарии оболочки).

#!/bin/bash
ls -lhF "$@" | awk -f /dev/fd/3 3<<'EOF'
( NF >= 9 ) {
    print "|-- [" $5 "] " $9
}
EOF

Внутри awk, можно считать вход из другой команды с помощью getline функционируйте и конструкция канала. Это не путь awk, прежде всего, разработан, чтобы использоваться, но это может быть сделано работать. Необходимо заключить аргументы имени файла в кавычки в пользу базовой оболочки, которая очень подвержена ошибкам. И так как текст, который будет обработан, не прибывает из ожидаемых источников (стандарт ввел или файлы, названные на командной строке), Вы заканчиваете со всем кодом в BEGIN блок.

#!/usr/bin/awk -f
BEGIN {
    command = "ls -lhF"
    for (i = 1; i <= ARGC; i++) {
        arg = ARGV[i];
        gsub("'", "'\\''", arg);
        command = command " '" arg "'";
    }
    ARGC = 0; for (i in ARGV) delete ARGV[i];
    while ((command | getline) > 0) {
        if (NF >= 9) { print "|-- [" $5 "] " $9 }
    }
}

Короче говоря, используйте оболочку для того, к чему она способна (такие как передача по каналу команд вместе), и awk для того, к чему она способна (такие как обработка текста).

2
27.01.2020, 21:17

Я не совсем уверен, что Вы пытаетесь сделать, но одна проблема, которая может подойти, добирается awk распечатать что ls считает последним полем, но который awk не считает так (через его парсинг значения по умолчанию). например.

-rw-r--r-- | 433k | filename-with-no-spaces      
-rw-r--r-- |   1k | link containing  spaces -> /home/user/filename-with-no-spaces

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

Сценарий ниже определяет максимальную ширину поля размера переменной ширины (необходимый для выходного форматирования). Существует несколько способов получить эту ширину; например, (1) использование awk обработать каждую строку ls вывод, в основном цикле, добавляя каждую строку к массиву для subequent END{ } обработка. или (2) пишут вывод ls во временный файл, и затем имеют awk обработайте тот файл. Метод показан ниже использования (2).

Обратите внимание что вывод ls может отправить некоторых, возможно, неожиданных, непростых, outpt Ваш путь, как в случае a link, таким образом, обычно более безопасно использовать find и настройте, это производится для лучше удовлетворения потребностям парсинга.

f=7               # the number of (multi-space) delimiters before the start of the filename  
myls="$(mktemp)"  # a temp file to hold  output from `ls`
w=$(ls --color=always -lFHk ~/ |tee "$myls" |awk '{print $5}' |wc -L) # max width of size field
h=k               # size unit
awk --re-interval -v"f=$f" -v"w=$w" -v"h=$h" '
  NF >= f {
    regex = "^([^ ]+ +){"f"}" 
    match( $0, regex )  # find start of name field
    printf( "%s | %"w"s%s | %s\n", $1, $5, h, substr( $0, RLENGTH ))
  }' "$myls"
rm "$myls"
2
27.01.2020, 21:17
  • 1
    Спасибо!, Но все еще что я спросил. Я хотел знать, могу ли я избавиться от всех сценариев оболочки и обработать вывод ls использование одного только awk сценария. –  westeros91 17.07.2012, 17:36

Я рекомендую стараться не изобретать велосипед и вместо этого использовать tree, который представляет каталог, files/folders и файлы/папки подкаталогов:

дерево (1) - страница справочника Linux

Имя:

дерево - перечисляет содержание каталогов в древовидном формате.

Резюме

дерево [-adfghilnopqrstuvxACDFNS] [-L уровень [-R]] [-H baseHREF] [-T заголовок] [-o имя файла] [-nolinks] [-P шаблон] [-I шаблон] [-inodes] [-устройство] [-noreport] [-dirsfirst] [-версия] [-справка] [-filelimit #] [каталог...]

Описание

Дерево является рекурсивной программой списка каталогов, которая производит расположенный с отступом список глубины файлов. Цвет является поддерживаемым крылом dircolors, если переменная среды LS_COLORS установлена, произведена, к tty, и флаг-C используется. Без аргументов дерево перечисляет файлы в текущем каталоге. Когда аргументы каталога даны, дерево перечисляет все файлы и/или каталоги, найденные в данных каталогах каждый в свою очередь. После завершения списка всех файлов/каталогов нашел, дерево возвращает общее количество файлов и/или перечисленных каталогов.

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

имя-> реальный путь

Если '-l' опция будет дан, и символьная ссылка обращается к фактическому каталогу, то дерево будет следовать за путем символьной ссылки, как будто это был реальный каталог.

1
27.01.2020, 21:17

Теги

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