LINUX.ORG.RU

echo перезаписывает вывод второй переменной поверх первой

 ,


0

1

Заранее прошу прощение за быдлокодинг, но всё же.

при выводе

echo "${y} ${x}";
$x пишется поверх $y

Тоесть: $x=foo, $y=test

получим на выхлопе foot

Исходники:

#!/bin/bash

for n in $@
do
  case $n in
    -n|--numeric) numeric=1 ;;
    -ip|--ip-sort) ip=1 ;;
    *) file=$n ;;
  esac
done

echo "-n=$numeric -ip=$ip -t=$test file=$file"

if [ ! -z $file ] && [ -a $file ]; then
#  echo "Файл $file существует";

  if [ "$ip" = "1" ]; then
    users=$(cat $1 | awk -F\| '{ print $3 $4}' | grep -Ev '254.51|administrator' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n | uniq );
    echo $ip
  else
    users=$(cat $1 | awk -F\| '{ print $4 $3}' | grep -Ev '254.51|administrator' | sort | uniq );
    echo $ip
  fi
  
  j=1;
  for x in ${users}; do 
  {
    if [[ $((j % 2)) = 0 ]]; then
      echo $y;
      echo "${y} ${x}"; #то самое спорное место
      j=$((j+1));
    elif [[ $((j % 2)) = 1 ]]; then
      y=$x;
      j=$((j+1));
    fi
  } 
  done;
else
  echo "Файл $file не существует";
  exit 1
fi

exit 0

Есть подозрение что дело в месте чуть выше:

users=$(cat $1 | awk -F\| '{ print $3 $4}' | grep -Ev '254.51|administrator' | sort | uniq );
Ибо при выполнении с ключом -ip перезаписи строки не наблюдается.

UPD: глюк только на linux Mint, на Dedian всё в норме О_о

echo "${y} ${x}" | sed 's/\r/ /g';
anonymous ()
Ответ на: комментарий от anonymous

Спасибо большое, а я в другую сторону смотрел... Сбило с толку то, что с ключём -ip всё выполнялось как надо.

madzane ()

cat $1 | awk -F\| '{ print $4 $3}' | grep -Ev '254.51|administrator'

почему нельзя было это сделать одной sed? На кой ляд тут cat? Точку почему не заэкранировал?

Ну и вообще, этого твоего $users надо было отфильтровать таким способом:

sed -rn 's/^(254\.51|administrator)\s+(\S+)\s*$/\2/p'  $1
Ну примерно, т.к. входного текста у меня нет.

if [[ $((j % 2)) = 1 ]]

вот так проще:

if (( j % 2 == 1 ))

emulek ()
Ответ на: комментарий от emulek

Я и признался что быдлокод =3 За наводки спасибо, пойду мучать sed.

madzane ()

может проще использовать printf заместо echo ...|sed ... ?

teod0r ★★★★★ ()
Ответ на: комментарий от teod0r

а нет. не то. не просмотрел скрипт до конца

teod0r ★★★★★ ()
Ответ на: комментарий от emulek

Линуксом пользуюсь неделю, встала задача переодически парсить логи вида

date | time | ip | username
вытаскивая ip и username, повторы убрать, убрать из вывода админа и определённые ip (ибо терминалки)

что нагуглил по каждому пункту то и юзал,про sed не вкурсе был

ну а дальше как говорится " и тут Остапа понесло", решил ключики разные подобавлять и тд =3

madzane ()
Ответ на: комментарий от madzane

на будущее: cat оно только в примерах используется так, как это ты делаешь. Конвейер тоже тут не нужен. Да и вообще, не нужно много команд, если можно сделать одной.

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

emulek ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.