Вывод переменных не объединяется

Потому что, когда вы используете только * net * (без каких-либо кавычек или экранирования), он будет расширен оболочкой как (существующий) файл / каталог net в текущем каталог перед запуском команды find . Таким образом, команда выглядит так:

find . -name net

Как видите, она просто соответствует net , поэтому usbnet.ko не будет сопоставлен.

Также обратите внимание, что без кавычек и экранирования, если шаблон не соответствует (и параметры nullglob и failglob отключены), он обрабатывается как ]. Так, например, для find. -name * net * , если имя файла не содержит net в текущем каталоге, поиск по шаблону будет * net * .


Итак, чтобы решить проблему, вам нужно избегать подстановки оболочки, для этого вы можете использовать кавычки или экранирование шаблонов подстановки:

find . -name '*net*' 
find . -name "*net*" 
find . -name \*net\* 
3
12.03.2017, 03:35
4 ответа

Если у вас есть 2 многострочные переменные, есть несколько способов их объединения:

  1. объявить переменные для тестирования

     $ snap_prefix="test-for-dr-
    тест-для-др-
    тест-для-др-
    тест-для-др-
    тест-для-др-"
    $ snap_daily="2017-03-10-08-00
    2017-03-10-11-00
    2017-03-10-12-00
    2017-03-10-14-00
    2017-03-10-15-00"
     
  2. использовать цикл bash для чтения строки из каждой переменной:

     while read префикс -u3; прочитать суффикс -u4; делать
    echo "$префикс$суффикс"
    сделано 3<<<"$snap_prefix" 4<<<"$snap_daily"
     
  3. используйте pr для преобразования одного потока в 2 столбца (а затем tr для удаления символа табуляции, разделяющего столбцы)

     { echo "$snap_prefix"; эхо "$ snap_daily"; } | пр-2Ц | тр -д '\т'
     

2 и 3 оба выводят:

test-for-dr-2017-03-10-08-00
test-for-dr-2017-03-10-11-00
test-for-dr-2017-03-10-12-00
test-for-dr-2017-03-10-14-00
test-for-dr-2017-03-10-15-00

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

grep -Eo 'test-for-dr-[[:digit:]-]+' snaps.txt
2
27.01.2020, 21:18

Одним из простых способов обхода проблемы является использование массивов, поскольку результаты возвращаются с новыми строками:

$ IFS=$'\n' readarray -t a< <(echo $'2017-03-10-08-00\n2017-03-10-11-00\n2017-03-10-12-00\n2017-03-10-14-00\n2017-03-10-15-00\n')

$ IFS=$'\n' readarray -t b < <(echo $'test-for-dr-\ntest-for-dr-\ntest-for-dr-\ntest-for-dr-\ntest-for-dr-\n')

$ declare -p a b
declare -a a=([0]="2017-03-10-08-00" [1]="2017-03-10-11-00" [2]="2017-03-10-12-00" [3]="2017-03-10-14-00" [4]="2017-03-10-15-00" [5]="")
declare -a b=([0]="test-for-dr-" [1]="test-for-dr-" [2]="test-for-dr-" [3]="test-for-dr-" [4]="test-for-dr-" [5]="")

$ for ((i=0;i<"${#a[@]}";i++));do conc="${b[$i]}${a[$i]}";echo "$conc";done
test-for-dr-2017-03-10-08-00
test-for-dr-2017-03-10-11-00
test-for-dr-2017-03-10-12-00
test-for-dr-2017-03-10-14-00
test-for-dr-2017-03-10-15-00

Другое решение - использовать просто сценарий awk для объединения результатов из всех файлов, но для этого нам нужны более подробные сведения - возможно, новый вопрос.

0
27.01.2020, 21:18

Если конечная цель - переупорядочить и распечатать поле 2 из файла snaps.txt , нет необходимости ни в промежуточных переменных, ни в конвейерах grep-sed-awk , единственный вызов awk должен быть в состоянии выполнить задание

awk '$2 ~ /test-for-dr-/{
     gsub(/[",]/, "", $2)
     match($2, "test-for-dr-")
     printf "%s%s\n", substr($2, RSTART), substr($2, 1, RSTART-1)
     }' snaps.txt
1
27.01.2020, 21:18

Делайте как:

#!/bin/bash

cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | sed 's/test-for-dr-//g' > snap_daily.txt
cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | awk -F '2017' '{print $1}' > snap_prefix.txt

a=`cat snap_daily.txt | wc -l`
let x=1
for i in `cat snap_daily.txt`
do
snap_daily=`cat snap_daily.txt | sed -n "$x"p`
snap_prefix=`cat snap_prefix.txt | sed -n "$x"p`
if [[ $x -eq $a ]]
then exit 0
fi
echo $snap_daily$snap_prefix
let x++
done
1
27.01.2020, 21:18

Теги

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