Как я могу получить grep для поиска любого числа, которое я положил в переменную? - PullRequest
0 голосов
/ 01 июня 2018

Итак, в начале моего сценария я определяю «порог», у которого есть номер, которого не будет в следующей части (2), и номер, который будет существовать в следующей части (6),У меня результат запуска df -h в файл с именем dffile.Мой вопрос, как я могу получить grep в строке 7 для поиска по всей переменной "threshold" для числа, которое будет существовать в файле?Это работает, если у меня есть 6 перед 2 в переменной, так что кажется, что он ищет только первое число в нем.Спасибо!

#!/bin/bash

threshold=("2%" "6%")

df -h > dffile

grep $threshold dffile >> thresh

cat thresh | awk '{print $6}' >> finding1

LINES=()
while IFS= read -r finding1
do
find $finding1 -xdev -size +40M -exec ls -lah {} \; | head -n 10
done < "finding1"

Вывод df -h на моем тестовом сервере:

root@tstd0001:~/scripts# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            481M     0  481M   0% /dev
tmpfs            99M  616K   98M   1% /run
/dev/vda1        25G  1.3G   23G   6% /
tmpfs           493M     0  493M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           493M     0  493M   0% /sys/fs/cgroup
/dev/vda15      105M  3.4M  102M   4% /boot/efi
tmpfs            99M     0   99M   0% /run/user/0

Как вы можете видеть выше, "2" из моей переменной не существует, тогда как«6» делает.Моя цель - заставить grep найти любое число, совпадающее с числом внутри переменной.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы инициализируете threshold как индексированный массив ,

threshold=("2%" "6%")

Затем вы вызываете grep с:

grep $threshold dffile

Так как thresholdмассив, чтобы разыменовать все значения в массиве, вы используете форму:

${threshold[@]}   ## which can be quoted to preserve whitespace in elements

Когда вы преобразуете массив как нормальную переменную, например, $threshold, вы возвращаете только 1-й элемент, например,

echo $threshold  ##  output '2%'

Итак, прежде чем идти дальше, вам нужно определить, что вы хотите передать grep, если вы хотите найти 2% или 6%, то у Аллана есть хорошее объяснение выше.Вы также можете создать выражение grep, используя printf -v, например,

printf -v gexp "%s\|%s" ${threshold[@]}

или, чтобы правильно ограничить первые 2 элемента,

printf -v gexp "%s\|%s" "${threshold[0]}" "${threshold[1]}"

и затем вызвать grepс

grep "$gexp" dffile >> thresh

Дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 01 июня 2018

Давайте рассмотрим, что cat output_df - это результат вашей команды df -h:

$ cat output_df
Filesystem      Size  Used Avail Use% Mounted on
udev            481M     0  481M   2% /dev
tmpfs            99M  616K   98M   1% /run
/dev/vda1        25G  1.3G   23G   6% /
tmpfs           493M     0  493M   6% /dev/shm
tmpfs           5.0M     0  5.0M   2% /run/lock
tmpfs           493M     0  493M   0% /sys/fs/cgroup
/dev/vda15      105M  3.4M  102M   4% /boot/efi
tmpfs            99M     0   99M   0% /run/user/0

Затем вы измените первую часть вашего сценария следующим образом:

thresold="2%|6%"
cat output_df | awk -v VAR=$thresold '{if($5~VAR)print $6}'

конечно, вам придется заменить cat output_df на df -h в финальном сценарии.

Это даст вывод:

/dev
/
/dev/shm
/run/lock

Пояснения:

  • thresold="2%|6%" - это регулярное выражение, соответствующее 2% или 6%, которое вы можете обобщить"2%|6%|X%|Y%|...|Z%"
  • Вы передаете его как переменную в awk через -v VAR=$thresold
  • Затем вы даете команду awk, чтобы вывести 6-е поле, когда 5-е поле соответствует регулярному выражению, которое выперешли к нему через '{if($5~VAR)print $6}'

Затем вы можете перегруппировать все, не используя промежуточные файлы:

thresold="2%|6%"
for f in `df -h | awk -v VAR=$thresold '{if($5~VAR)print $6}'`
do 
   find $f -xdev -size +40M -exec ls -lah {} \; 2>/dev/null | head -n10
done

На моем боксе выдает следующий вывод:

-rw-r--r-- 1 root root 47M  6月  1 06:33 /var/cache/apt/srcpkgcache.bin
-rw-r--r-- 1 root root 47M  6月  1 06:33 /var/cache/apt/pkgcache.bin
-rw-r--r-- 1 root root 62M  4月 28 02:27 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar
-rw-r--r-- 1 root root 56M  2月 20 06:10 /usr/lib/libreoffice/program/libmergedlo.so
-rw-r--r-- 1 root root 73M  5月 22 19:31 /usr/lib/thunderbird/libxul.so
-rwxr-xr-x 1 root root 142M  5月 22 01:35 /usr/lib/chromium-browser/chromium-browser
-rw-r--r-- 1 root root 41M  5月  8 09:57 /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.28.2
-rw-r--r-- 1 root root 54M 11月 17  2017 /usr/lib/x86_64-linux-gnu/libLLVM-5.0.so.1
-rw-r--r-- 1 root root 99M  3月 18  2017 /usr/lib/x86_64-linux-gnu/libOxideQtCore.so.0
-rwxr-xr-x 1 root root 42M  5月  8 09:57 /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitPluginProcess2
 ...

Примечания: 2>/dev/null это перенаправление для удаления всех ошибок разрешений путем перенаправления stderr на /dev/null (приглушение stderr)

...