如何让 grep 搜索我放入变量中的任何数字?
How do I get grep to search for any number I put in the variable?
所以在我的脚本开头,我定义了 "threshold,",其中有一个数字不会存在于下一部分,(2) 和一个数字将存在于下一部分(6).我将 运行 df -h
的结果保存到名为 dffile 的文件中。我的问题是,如何在第 7 行中使用 grep 来搜索所有变量 "threshold" 以查找文件中将存在的数字?如果我在变量中的 2 之前有 6,它就会工作,所以它似乎只搜索其中的第一个数字。谢谢!
#!/bin/bash
threshold=("2%" "6%")
df -h > dffile
grep $threshold dffile >> thresh
cat thresh | awk '{print }' >> 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 找到与变量内的数字匹配的任何数字。
我们假设 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(~VAR)print }'
当然,您必须在最终脚本中将 cat output_df
替换为 df -h
。
这将给出输出:
/dev
/
/dev/shm
/run/lock
解释:
thresold="2%|6%"
是匹配 2%
或 6%
的正则表达式,您可以将其概括为 "2%|6%|X%|Y%|...|Z%"
- 您通过
-v VAR=$thresold
将其作为变量传递给 awk
- 然后你命令
awk
在第 5 个字段与你通过 '{if(~VAR)print }'
传递给它的正则表达式匹配时打印第 6 个字段
然后你可以在不使用中间文件的情况下重新组合所有内容:
thresold="2%|6%"
for f in `df -h | awk -v VAR=$thresold '{if(~VAR)print }'`
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
)
来消除所有权限错误
您将 threshold
初始化为 索引数组,
threshold=("2%" "6%")
然后您调用 grep
:
grep $threshold dffile
由于 threshold
是一个数组,要取消引用数组中的所有值,您可以使用以下形式:
${threshold[@]} ## which can be quoted to preserve whitespace in elements
当您将数组作为普通变量引用时,例如$threshold
你 return 只有第一个元素,例如
echo $threshold ## output '2%'
因此,在继续之前,您需要确定要传递给 grep
的内容,如果您想搜索 2%
或 6%
,那么 Allan 有一个很好的上面的解释。您还可以使用 printf -v
构造 grep
表达式,例如
printf -v gexp "%s\|%s" ${threshold[@]}
或正确限制前 2 个元素,
printf -v gexp "%s\|%s" "${threshold[0]}" "${threshold[1]}"
然后用
调用grep
grep "$gexp" dffile >> thresh
如果您还有其他问题,请告诉我。
所以在我的脚本开头,我定义了 "threshold,",其中有一个数字不会存在于下一部分,(2) 和一个数字将存在于下一部分(6).我将 运行 df -h
的结果保存到名为 dffile 的文件中。我的问题是,如何在第 7 行中使用 grep 来搜索所有变量 "threshold" 以查找文件中将存在的数字?如果我在变量中的 2 之前有 6,它就会工作,所以它似乎只搜索其中的第一个数字。谢谢!
#!/bin/bash
threshold=("2%" "6%")
df -h > dffile
grep $threshold dffile >> thresh
cat thresh | awk '{print }' >> 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 找到与变量内的数字匹配的任何数字。
我们假设 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(~VAR)print }'
当然,您必须在最终脚本中将 cat output_df
替换为 df -h
。
这将给出输出:
/dev
/
/dev/shm
/run/lock
解释:
thresold="2%|6%"
是匹配2%
或6%
的正则表达式,您可以将其概括为"2%|6%|X%|Y%|...|Z%"
- 您通过
-v VAR=$thresold
将其作为变量传递给 awk
- 然后你命令
awk
在第 5 个字段与你通过'{if(~VAR)print }'
传递给它的正则表达式匹配时打印第 6 个字段
然后你可以在不使用中间文件的情况下重新组合所有内容:
thresold="2%|6%"
for f in `df -h | awk -v VAR=$thresold '{if(~VAR)print }'`
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
)
您将 threshold
初始化为 索引数组,
threshold=("2%" "6%")
然后您调用 grep
:
grep $threshold dffile
由于 threshold
是一个数组,要取消引用数组中的所有值,您可以使用以下形式:
${threshold[@]} ## which can be quoted to preserve whitespace in elements
当您将数组作为普通变量引用时,例如$threshold
你 return 只有第一个元素,例如
echo $threshold ## output '2%'
因此,在继续之前,您需要确定要传递给 grep
的内容,如果您想搜索 2%
或 6%
,那么 Allan 有一个很好的上面的解释。您还可以使用 printf -v
构造 grep
表达式,例如
printf -v gexp "%s\|%s" ${threshold[@]}
或正确限制前 2 个元素,
printf -v gexp "%s\|%s" "${threshold[0]}" "${threshold[1]}"
然后用
调用grep
grep "$gexp" dffile >> thresh
如果您还有其他问题,请告诉我。