Как вычесть два раза в оболочке

Можно использовать -o для "или":

find . -path '*/trunk/src/*.h' -o -path '*/trunk/src/*.cpp'

который совпадает с

find . -path '*/trunk/src/*' \( -name '*.h' -o -name '*.cpp' \)

Если Вы хотите выполнить grep на этих файлах:

find . \( -path '*/trunk/src/*.h' -o -path '*/trunk/src/*.cpp' \) -exec grep PATTERN {} +

или

find . -path '*/trunk/src/*' \( -name '*.h' -o -name '*.cpp' \) -exec grep PATTERN {} +
3
09.01.2016, 22:12
4 ответа
echo "${ruby_versions[@]}" | sed 's/\S\+:://g;s/\s\+/\n/g'| sort -u

выходы:

1.7.13
1.7.4
2.1.1

или если вы хотите Bash Встроенные

unset u
for i in "${ruby_versions[@]}"
do
  if [[ ! $u =~ ${i##*::} ]]
  then
    u=${u:+$u\\n}${i##*::}
  fi
done
echo -e "$u"
-121--108580-

Я бы сделал шаг дальше (вдохновленный этим постом ):

# => 18:23:24 --> 66204
grep usb /var/log/kern.log|tail -2|awk '{print $3}'|awk -F: '{print ($1 * 3600) + ($2 * 60) + $3 }'

Итак, после того, как у меня было:

66204
66020

Вы могли бы сделать:

echo $((66204-66020)) # => 184
8
27.01.2020, 21:09

Если вы используете AWK , вы можете сделать это в одном вызове

awk '
/usb/{
("date +%s -d "$3)|getline t[++i];
}
END{
print t[i-1]-t[i];
}' /var/log/kern.log
0
27.01.2020, 21:09

Ваш весь конвейер в awk без большого количества ненужных каналов.
Подобный costas, но не используя внешних команд.

awk '/usb/{split($3,a,":");b[++x]=(a[1]*3600)+(a[2]*60)+a[3]}END{print b[x-1]-b[x]}' /var/log/kern.log

Heres просто последний бит с датами, разработанными, если вы решаете сохранить каналы

 awk '{split($1,a,":");b[x++]=(a[1]*3600)+(a[2]*60)+a[3]}END{print b[0]-b[1]}'
0
27.01.2020, 21:09

А более общее решение, потому что это работает с временами с различных дат, также:

echo "18:23:24
18:20:20" | 
  (read later_time; read former_time;
    former_seconds=$(date --date="$former_time" +%s);
    later_seconds=$(date --date="$later_time" +%s);
    echo $((later_seconds-former_seconds)) )
184
4
27.01.2020, 21:09

Теги

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