下面是我的输入文件,我需要传递并找出其值大于10G。
100G tom
30G kelly
40G messy
50G Kyrie
1G james
.5G curry
2.4 sweety
57G muller
6G kevin
以下是bash中的代码尝试。
for i in `cat test.txt`;
do
k=$(echo $i | awk '{print $1}' | grep G | cut -d'G' -f1;);
j=$(echo $i | grep -v '^[0-9]';);
int=${k%.*};
if [[ -z $int ]];
then continue
else
if [ $int -ge 10 ];
then
# du -sh
echo $j
# sudo du -sh $j
fi
fi
# echo $int
done
如果超过10,即if [ $int -ge 10 ]
正在发挥作用,它就会产生结果。如果值大于10Gig,我无法打印名称。简单来说,我的预期结果是
100G tom
30G kelly
40G messy
50G Kyrie
57G muller
答案 0 :(得分:3)
awk 'BEGIN{FS="G| "} $1>10' inputfile
100G tom
30G kelly
40G messy
50G Kyrie
57G muller
这是使用G
作为字段分隔符,$1>10
是打印整个记录的条件。一段时间空间也用作字段分隔符来处理像2.4 sweety
注意:这假定您的输入仅在Gigs中有记录。
答案 1 :(得分:2)
使用numfmt
工具( GNU Coreutils 的一部分):
while read -r line
do
n=$(numfmt --from=auto --format %f "${line%% *}")
(( $(bc <<< "$n > 10000000000") )) && printf '%s\n' "$line"
done < test.txt
循环逐行读取test.txt
个文件; -r
选项可防止解释反斜杠。由于IFS
变量未被修改,line
被修剪,我们可以安全地提取第一列,其中包含"${line%% *}"
这样的表达式,它会删除第一个空格以及它之后的所有内容第一栏。
numfmt
命令将第一列转换为浮点格式。
由于Bash不支持浮点数,bc
用于检查$n
是否大于10000000000.如果是,则命令以零状态退出(表示成功),{调用{1}}命令。
显然,您可以将上述代码与其他常用单位一起使用,例如printf
,K
,Ki
,M
等。
由于实际文件的大小以整数表示,因此您可以摆脱&#34;浮点运算&#34;通过以下方式:
Mi
零精度格式declare -i n=$(numfmt --from=auto --format %.0f "${line%% *}")
(( $n > 10000000000 )) && printf '%s\n' "$line"
表示%.0f
将结果返回为(舍入)整数。第二行使用arithmetic expansion检查numfmt
是否大于10000000000。
在 Mac OS 上,$n
工具由GNU Coreutils包提供;可执行文件的名称是numfmt
。
答案 2 :(得分:1)
您可以将grep用作:
egrep '^0*[1-9][0-9]+\.?[0-9]*G' file_name
答案 3 :(得分:1)
Don't read lines with for
.阅读包含两个字段的行的惯用方法是
while read -r first second; do
: ... things
done <test.txt
但当然,你可以简单地做到
awk '($1 ~ /G$/ && $1+0>10) || $1 ~ /[TP]$/' test.txt
(我添加了太字节和数PB只是为了告诉你如果你需要的话它是如何完成的。)
通常,在shell中逐个循环遍历文件中的行是反模式,建议您尝试使用sed
或Awk,除非确实需要循环体是shell脚本。
答案 4 :(得分:0)
你可以试试这个:
bash-4.4 $ cat filename
100G汤姆
30G Kely
40G凌乱
50G kyrie
1G james
.5G咖喱
2.4甜心
57G研磨机
6G凯文
bash-4.4 $ cat script.sh
cat filename | grep&#34; G&#34;&gt; tempFile
读取线;
做
大小= echo $line|awk 'BEGIN{FS="G"}{print $1}'
检查= echo $line|grep "^[0-9]"|wc -l
如果[$ check -ne 0]
然后
如果[$ size -gt 10]
然后
echo $ line
科幻
科幻
DONE
bash-4.4 $ ./script.sh
100G汤姆
30G Kely
40G凌乱
50G kyrie
57G muller
如果不再需要,可以删除脚本末尾的临时文件。或者每次运行脚本时都会被覆盖。
希望这会有所帮助。