vieyahn2017 / shellv

shell command test and study
4 stars 1 forks source link

4.30 shell字符串截取 #35

Open vieyahn2017 opened 5 years ago

vieyahn2017 commented 5 years ago

shell 脚本从字符串中提取想要的字符

https://blog.csdn.net/yuchunhai321/article/details/82585847

vieyahn2017 commented 5 years ago
!/bin/bash
test=China_jolin_Tsai_Singer.mp3

num1=${test#*_} 
num2=${num1#*_} 
surname=${num2%_*}

num4=${test##*_}
profession=${num4%.*}

echo $test
echo $num1
echo $num2
echo $surname
echo $num4
echo $profession

运行结果:

test = China_jolin_Tsai_Singer.mp3
num1 = jolin_Tsai_Singer.mp3
num2 = Tsai_Singer.mp3
surname = Tsai
num4 = Singer.mp3
profession = Singer
vieyahn2017 commented 5 years ago

说明:

#*_:     从左边开始,去第一个符号“_”左边的所有字符                                        *代表要删除的字符

% _*:   从右边开始,去掉第一个符号“_”右边的所有字符

##*_:   从右边开始,去掉第一个符号“_”左边的所有字符

%%_*: 从左边开始,去掉第一个符号“_”右边的所有字符
vieyahn2017 commented 5 years ago

hbase example

hbase_list_result=`echo list | hbase shell 2>\dev\null`
# 这样会把stdoiut信息存入list_end变量,把stderr信息丢弃

echo $hbase_list_result

Debug is  true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false Acquire TGT from Cache Principal is idauser@HADOOP.COM Commit Succeeded  Debug is  true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false Acquire TGT from Cache Principal is idauser@HADOOP.COM Commit Succeeded  INFO: Watching file:/opt/client/HBase/hbase/conf/log4j.properties for changes with interval : 60000 Debug is  true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false Acquire TGT from Cache Principal is idauser@HADOOP.COM Commit Succeeded  HBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version 1.3.1, rUnknown, Fri May 18 09:54:11 CST 2018 list TABLE appdata audit metadata scores 4 row(s) in 0.2170 seconds ["appdata", "audit", "metadata", "scores"]

hbase_list_arr_str=${hbase_list_result##*[}
#   ##*[ 从右边开始,去掉第一个符号[左边的所有字符

echo $hbase_list_arr_str
"appdata", "audit", "metadata", "scores"]
vieyahn2017 commented 5 years ago

echo $hbase_list_result

Debug is true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false Acquire TGT from Cache Principal is idr@HADOOP.COM Commit Succeeded Debug is true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false Acquire TGT from Cache Principal is idr@HADOOP.COM Commit Succeeded INFO: Watching file:/opt/client/HBase/hbase/conf/log4j.properties for changes with interval : 60000 Debug is true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false Acquire TGT from Cache Principal is idr@HADOOP.COM Commit Succeeded HBase Shell; enter 'help' for list of supported commands. Type "exit" to leave the HBase Shell Version 1.3.1, rUnknown, Fri May 18 09:54:11 CST 2018 list TABLE appdata audit metadata scores 4 row(s) in 0.2170 seconds ["appdata", "audit", "metadata", "scores"]

vieyahn2017 commented 5 years ago

shell脚本字符串截取的8种方法

https://www.cnblogs.com/zwgblog/p/6031256.html

假设有变量 var=http://www.aaa.com/123.htm.

1. # 号截取,删除左边字符,保留右边字符。

echo ${var#*//}

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符 即删除 http:// 结果是 :www.aaa.com/123.htm

2. ## 号截取,删除左边字符,保留右边字符。

echo ${var##*/}

其中 ##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符 即删除 http://www.aaa.com/

结果是 123.htm

3. %号截取,删除右边字符,保留左边字符

echo ${var%/*}

其中%/* 表示从右边开始,删除第一个 / 号及右边的字符

结果是:http://www.aaa.com

4. %% 号截取,删除右边字符,保留左边字符

echo ${var%%/*}

其中 %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符 结果是:http:

5. 从左边第几个字符开始,及字符的个数

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。 结果是:http:

6. 从左边第几个字符开始,一直到结束。

echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。 结果是 :www.aaa.com/123.htm

7. 从右边第几个字符开始,及字符的个数

echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。 结果是:123

8. 从右边第几个字符开始,一直到结束。

echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。 结果是:123.htm

注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

vieyahn2017 commented 3 years ago

${ }的一些特异功能

定义一个变量: file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换获得不同的值: ${file#/} 拿掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##/} 拿掉最后一个 / 及其左边的字符串:my.file.txt ${file#.} 拿掉第一个 . 及其左边的字符串:file.txt ${file##.} 拿掉最后一个 . 及其左边的字符串:txt ${file%/} 拿掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3 ${file%%/} 拿掉第一个 / 及其右边的字符串:(空值) ${file%.} 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file ${file%%.} 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法: # 去掉左边(键盘上 # 在 $ 的左边) % 去掉右边(在键盘上 % 在 $ 的右边) 单一符号是最小匹配,两个符号是最大匹配。 ${file:0:5} 提取最左边的 5 个字节:/dir1 ${file:5:5} 提取第 5 个字节右边的连续 5 个字节:/dir2 也可以对变量值里的字符串作替换: ${file/dir/path} 将第一个 dir 替换为 path:/path1/dir2/dir3/my.file.txt ${file//dir/path} 将全部 dir 替换为 path:/path1/path2/path3/my.file.txt 利用${ }还可针对不同的变量状态赋值(未设定、空值、非空值): ${file-my.file.txt} 若 $file 未设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理) ${file:-my.file.txt} 若 $file 未设定或为空值,则使用 my.file.txt 作传回值。(非空值时不作处理) ${file+my.file.txt} 若 $file 设为空值或非空值,均使用 my.file.txt 作传回值。(未设定时不作处理) ${file:+my.file.txt} 若 $file 为非空值,则使用 my.file.txt 作传回值。(未设定及空值时不作处理) ${file=my.file.txt} 若 $file 未设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt。 (空值及非空值时不作处理) ${file:=my.file.txt} 若 $file 未设定或为空值,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt。 (非空值时不作处理) ${file?my.file.txt} :若 $file 未设定,则将 my.file.txt 输出至 STDERR。(空值及非空值时不作处理) ${file:?my.file.txt} :若 $file 未设定或为空值,则将 my.file.txt 输出至 STDERR。(非空值时不作处理) 以上的理解在于,一定要分清楚 unset 与 null 及 non-null 这三种赋值状态。 一般而言,与 null 有关,若不带 : 的话,null 不受影响,若带 : 则连 null 也受影响。 ${#var} 可计算出变量值的长度: ${#file} 可得到 27,/dir1/dir2/dir3/my.file.txt 刚好是 27 个字节。

vieyahn2017 commented 3 years ago

shell去掉字符串最后一个字符

var=”12345467,”
${var%?}=”1234567”