小编sci*_*ci9的帖子

Bash:提取 IPv4 地址的四个部分之一

我们可以使用语法${var##pattern}${var%%pattern}提取 IPv4 地址的最后和第一部分:

IP=109.96.77.15
echo IP: $IP
echo 'Extract the first section using ${var%%pattern}: ' ${IP%%.*}
echo 'Extract the last section using ${var##pattern}: ' ${IP##*.}
Run Code Online (Sandbox Code Playgroud)

我们如何使用参数扩展提取 IPv4 地址的第二或第三部分?

这是我的解决方案:我使用一个数组并更改 IFS 变量。

:~/bin$ IP=109.96.77.15
:~/bin$ IFS=. read -a ArrIP<<<"$IP"
:~/bin$ echo ${ArrIP[1]}
    96
:~/bin$ printf "%s\n" "${ArrIP[@]}"
    109
    96
    77
    15
Run Code Online (Sandbox Code Playgroud)

此外,我已经写了使用一些解决方案awksed以及cut命令。

现在,我的问题是:是否有基于不使用数组和 IFS 更改的参数扩展的更简单的解决方案?

shell bash parameter ipv4 variable-substitution

10
推荐指数
4
解决办法
9768
查看次数

Bash:如何使用 $RANDOM 生成随机浮点数

是否可以使用整数随机生成器 $RANDOM 生成具有特定精度和特定范围的真实随机数?例如,我们如何生成介于 0 和 1 之间的 4 个精度的实数?

0.1234
0.0309
0.9001
0.0000
1.0000
Run Code Online (Sandbox Code Playgroud)

一个简单的解决方法:

printf "%d04.%d04\n" $RANDOM $RANDOM
Run Code Online (Sandbox Code Playgroud)

shell bash random numeric-data printf

8
推荐指数
3
解决办法
1万
查看次数

使用 WHILE 循环而不是 FOR 循环重命名文件

考虑到我们有很多名字像DSC_20170506_170809.JPEG. 为了重命名照片以使其遵循模式Paris_20170506_170809.JPEG,我编写了以下完美运行的脚本。

for file in *.JPEG; do mv ${file} ${file/DSC/Paris}; done
Run Code Online (Sandbox Code Playgroud)

我的问题是,我们如何使用while循环而不是循环来编写此脚本for

bash rename for

4
推荐指数
1
解决办法
2531
查看次数

sed: !p 命令奇怪的行为

为什么以下命令打印数值?

$ iostat | sed -n '/[:digit:]/!p'

       1.56    1.38    0.31    0.34    0.03   96.38
Run Code Online (Sandbox Code Playgroud)

sed numeric-data

3
推荐指数
1
解决办法
265
查看次数

awk (mawk): 正则表达式编译失败(缺少操作数)

我想将以下正则表达式与 awk 一起使用来验证电话号码:

echo 012-3456-7890 | awk '/^\(?0[1-9]{2}\)?(| |-|.)[1-9][0-9]{3}( |-|.)[0-9]{4}$/ {print $0}'
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

awk: line 1: regular expression compile failed (missing operand)
Run Code Online (Sandbox Code Playgroud)

awk regular-expression mawk

1
推荐指数
1
解决办法
3650
查看次数