2013-03-15 2 views
2

У меня есть Баш скрипт, который выводит следующее:зачистка первой части водопроводной продукции

SUM = 137892134.0000000 

мне нужно сдирать первую часть строки, оставив только номер, отформатированный в виде целого числа, если это возможно , Я предполагаю, что мне нужно использовать sed, но у меня, похоже, есть нулевая способность, чтобы изучить его.

Мне нужно написать условный оператор, который может работать, если значение меньше 100. Я не знаю, могу ли я сделать это в сценарии bash, но это будет вторая часть моей задачи ,

+0

Возможно ли изменить исходный сценарий bash, чтобы он просто возвращал то, что вы хотите? – summea

+0

Нет. Я так не думаю. – ShaunLangley

ответ

2

Основной формой замещения СЭД является:

s/replace this/with this/ 

Где «заменить это» и «с этим» являются регулярными выражениями. В вашем случае вы хотите полностью избавиться от буквенной строки «SUM =» в начале и десятичной в конце. Итак:

#!/bin/bash 
sum=$(your_script.sh | sed 's/^SUM = //' | sed 's/\..*//') 
if ! egrep -q '^[0-9]+$' <<< $sum; then 
    echo "your_script.sh printed unexpected output!" 
    exit 1 
fi 
if [ $sum -lt 100 ]; then 
    echo "$sum is less than 100" 
else 
    echo "$sum is not less than 100" 
fi 

Первая строка это то, что получается "SUM = 137892134.0000000" в "137892134". Первое sed заменяет «SUM =» в начале строки (^) ничем (т. Е. Удаляет). Второй sed находит характер первого периода (\.) и заменяет его и все после него (.*) ни с чем. Полученная строка затем сохраняется в переменной $sum с использованием $(...).

Оператор if, использующий egrep, проверяет, чтобы значение, которое мы сохранили в $sum, фактически является целым числом и освобождается взаправду, если это не так.

Второй оператор if сравнивает значение $ sum, которое, как мы теперь знаем, является целым числом, равным 100.

+0

Спасибо! Он отлично работает! – ShaunLangley

1

Вот один из способов использования sed сделать это:

echo 'SUM = 137892134.0000000' | sed 's/[^0-9.]//g' | sed 's/\..*//g' 

Это то, что результат должен выглядеть следующим образом: 137892134.

Некоторые пояснения по командам:

  • sed 's/[^0-9.]//g' говорит sed, чтобы удалить все символы, которые не являются числами (0 - 9) или периоды (.)

  • sed 's/\..*//g' рассказывает sed удалить любые символы (.*) после запятой (\.)

  • Кроме того, вместо использования echo вы можете использовать выходные данные из исходного сценария для этой первой части ... и затем его можно передать в sed, чтобы получить окончательный «int», который вы хотите.

Примечание: это не принимает во внимание любые округлении вопросы, как воспитываются Уильям Перселл.

0

Я предлагаю:

bashScript | sed 's/.* \(.*\)\.0*/\1/' 

На английском языке: «Возьмите кучу материала с последующим пробелом, а затем что-то, за которым следует точка и, возможно, некоторые нули, и заменить все, что с что-то. "

2

Мне непонятно, как вы хотите обрабатывать «123.789» (напечатайте ли вы 124 или 123 при печати в виде целого числа). Рассмотрим:

if $(echo SUM = 137892134.0000000 | awk '{printf "%d", $3}') -lt 100; then 
    echo the value is less than 100!! 
fi 

Вы также можете сделать:

if echo SUM = 137892134.0000000 | awk '$3 >= 100 { exit 1}'; then 
    echo the value is less than 100!! 
fi 

или

if ! echo SUM = 137892134.0000000 | awk '{exit $3 < 100}'; then 
    echo the value is less than 100!! 
fi 

Обратите внимание, что логика является немного запутанным, как awk возвращение 1 оценивает к провалу, так что оператор сравнения обратное тому, что можно ожидать.

+0

Хороший вопрос об округлении; – summea