Как объединить несколько конвейерных команд awk в одну команду awk

Вы должны смонтировать (или привязать монтирование )к некоторому каталогу:

mount /dev/mmcblk0p1 /mnt
cd /mnt
tar cjf /otherdisk/archive.tar.bz2 *

Вы также можете отправить результат по ssh (, если он включен в вашей конфигурации busybox )вместо локального сохранения, и, кстати, использовать вычислительную мощность целевого хоста/установленные инструменты для выполнения сжатия:

tar cf - * | ssh user@host "bzip2 | cat > archive.tar.bz2"

Адаптируйте инструмент сжатия, имя архива и т. д. по своему желанию:)

1
19.11.2020, 07:52
5 ответов

Чтобы добиться указанного выше результата, я просто использовал регулярное выражение для разделителя полей, регулярное выражение для выбора строк и {print $1}для печати первого столбца.

Я не вижу начальных пробелов или пустых строк в вашем примере, но если вам нужно с ними справиться, посмотрите мои варианты этой команды ниже.

awk -F'[:=]' '!/^[#{]/{print $1}' filename.txt

Результат:

a
b
c
d
e

Если у вас есть пробелы в начале или в конце, может работать следующее. Хотя, признаюсь, не видя примера, мне трудно представить.

awk -F'[:=]' '{gsub(/^\s+|\s+$/,"",$1)} !/^[#{]/{print $1}' filename.txt

Чтобы охватить все возможные случаи, основываясь на ваших комментариях, я адаптировал пример. Теперь у нас есть начальные и конечные пробелы и пустые строки.

a:10
b :20
  c:60
# comment

 {{# random mustache templating}}
d=4
e =6   

Это немного измененная команда для решения этой проблемы.:

awk -F'[:=]' '{gsub(/^\s+|\s+$/,"",$1)} !/^[#{]/ && !/^$/{print $1}' filename.txt
  1. Регулярное выражение разделителя полей отделяет первое поле $1от всего, что идет после :или=
  2. gsub удаляет все начальные и конечные пробелы
  3. Регулярное выражение перед {print $1}удаляет все строки, начинающиеся с #или {, чтобы исключить комментарии, «шаблоны» и пустые строки.

Это дает следующий результат из адаптированного примера:

a
b
c
d
e
0
18.03.2021, 22:48

Использованиеsed:

sed -E '{ s/\s*([^:=]*).*/\1/ }; /^(\{\{|#|$)/d' infile

Перетащите порядок приведенных выше команд на sed -E '/.../d; {... }', если вы также хотите сохранить те строки, которые не начинаются сразу с символов {{или #, а с пробелов.

0
18.03.2021, 22:48

Разделитель полей может быть полным регулярным выражением, поэтому

awk -F'[:#=]' '!/^{{/ && length($1) > 0 { split($1, a, " "); print a[1] }' filename.txt

достаточно :любой из ‘:’, ‘#’, ‘=’ будет действовать как разделитель. Мы исключаем строки, начинающиеся с «{{», сопоставляем строки, где $1не является -пустым, разделяем $1на пробелы и печатаем первое полученное поле.

2
18.03.2021, 22:48

Возможно, это поможет вам достичь ожидаемого результата

#!/bin/bash

dynamic_array=()

while read -r line 
do 
    var=$(echo "$line" | cut -c 1)    
    if ! { [ "$var" = '#' ] ||  [ "$var" = '{' ] || [ "$var" = '}' ]; }
    then
                 dynamic_array+=("$var")   
    fi 
done < A.txt

str_array_value="${dynamic_array[*]}" ; echo "$str_array_value" | tr ' ' '\n' | awk '!seen[$0]++'

Выход:

a   
b   
c    
d
e
-1
18.03.2021, 22:48

Будьте проще:

$ awk 'NF && ($1 !~ /^(#|\{+)/) { sub(/[:=].*/,""); print $1 }' file
a
b
c
d
e
1
18.03.2021, 22:48

Теги

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