Bash one-liner返回子串

时间:2017-10-25 00:43:49

标签: linux bash awk sed cut

我的字符串是:

UNSORTED            SORTED  
Address Type        Address Type
1.1p    A           1.1p    A
1.2p    A           1.2p    A
1.3p    A           1.3p    A
1.4p    A           1.4p    A
2.1p    A           3.1p    A
2.2p    A           3.2p    A
2.3p    A           3.3p    A
2.4p    A           3.4p    A
3.1p    A           5.1p    A
3.2p    A           5.2p    A
3.3p    A           5.3p    A
3.4p    A           5.4p    A
4.1p    A           2.1p    A
4.2p    A           2.2p    A
4.3p    A           2.3p    A
4.4p    A           2.4p    A
5.1p    A           4.1p    A
5.2p    A           4.2p    A
5.3p    A           4.3p    A
5.4p    A           4.4p    A
6.1p    B           7.1p    B
6.2p    B           7.2p    B
6.3p    B           7.3p    B
6.4p    B           7.4p    B
7.1p    B           9.1p    B
7.2p    B           9.2p    B
7.3p    B           9.3p    B
7.4p    B           9.4p    B
8.1p    B           6.1p    B
8.2p    B           6.2p    B
8.3p    B           6.3p    B
8.4p    B           6.4p    B
9.1p    B           8.1p    B
9.2p    B           8.2p    B
9.3p    B           8.3p    B
9.4p    B           8.4p    B
10.1p   B           10.1p   B
10.2p   B           10.2p   B
10.3p   B           10.3p   B
10.4p   B           10.4p   B

我想在0%中返回0。

问题是这个字符串的长度是可变的,但只有一个字符。我在bash变量中有这个字符串时,我试图检索数据包丢失的整数(或十进制)值。

我曾经尝试过cut和awk,但是我在这个问题上绞尽脑汁。

谢谢!

3 个答案:

答案 0 :(得分:2)

为演示目的更改值:使用正则表达式并捕获百分号前的数字

$ str=' PING google.com ... 3 packets transmitted, 3 received, 42% packet ...'

$ [[ $str =~ ([0-9]+)% ]] && num=${BASH_REMATCH[1]}

$ echo $num
42

使用perl兼容的正则表达式使用GNU grep:

$ grep -oP '\d+(?=%)' <<<"$str"
42

答案 1 :(得分:2)

sed

sed -r 's/.*\b([0-9]+)%.*/\1/' <<< $str

答案 2 :(得分:1)

如果您的数据与显示的样本相同,则以下内容可能会对您有所帮助。

awk '{print $18+0}' Input_file