目录
linux下awk内置函数的使用(split/substr/length)
一、字符串分割
1、awk分割
print 截取
awk '{print substr(,1,8)}' 打印所有列的1-8字节
awk '{print substr($1,1,8)}' 打印1列的1-8字节
awk '{print substr($1,7)}' 打印1列的7-最后所有字节
spiit
把 ceph_12.2.1.centos.x86_64.tar.gz-2021-10-08-08后面的2021-10-08-08按“-”分割,取最后一个数字。
#split($1, arr, "-") ,把第一列,以“-”为分割符分割,把分割得到的结果放入arr数字中。(arr数组从1开始)
echo "ceph_12.2.1.centos.x86_64.tar.gz-2021-10-08-08"|awk '{split($1, arr, "-"); print arr[5]}'
如果要以双引号作为分隔符则需要转译:awk '{split($1, arr, "\"")
#注意split是awk的内置函数,更多见文章末尾
2、利用shell 中 变量 的字符串替换成空格分割
原理:
${parameter//pattern/string}
用string来替换parameter变量中所有匹配的pattern
参考文章: Shell_Shell 脚本中字符串的相关操作_迎难而上-CSDN博客
string="hello,shell,split,test" 中的“,”替换成空格后赋值给array 就成了数组赋值
#!/bin/bash
string="hello,shell,split,test"
array=(${string//,/ })
for var in ${array[@]}
do
echo $var
done
3、设置分隔符,通过 IFS 变量
原理
自定义IFS变量, 改变分隔符, 对字符串进行切分
参考文章:
Shell中的IFS解惑_Simple life-CSDN博客
#!/bin/bash
string="hello,shell,split,test"
#对IFS变量 进行替换处理
OLD_IFS="$IFS" #保存当前shell默认的分割符,一会要恢复回去
IFS="," #将shell的分割符号改为,“”
array=($string) #分割符是“,”,"hello,shell,split,test" 赋值给array 就成了数组赋值
IFS="$OLD_IFS" #恢复shell默认分割符配置
for var in ${array[@]}
do
echo $var
done
4、利用tr 指令实现字符替换
原理
由于只是对单个字符进行的替换,则可以用 echo args | tr "oldSpilt" "newSpilt" 的方式实现。
r 指令讲解
背景介绍
tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
语法
tr(选项)(参数)
选项
-c或——complerment:取代所有不属于第一字符集的字符;
-d或——delete:删除所有属于第一字符集的字符;
-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
参数
字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
字符集2:指定要转换成的目标字符集。
#!/bin/bash
string="hello,shell,split,test"
array=(`echo $string | tr ',' ' '` )
for var in ${array[@]}
do
echo $var
done
Shell_Linux Shell 中实现字符串切割的几种方法_迎难而上-CSDN博客_shell 字符串分割
二、文件分割
按行切割
基础版
split -l 1000 test.txt -d -a 3 test_
-l:按行分隔,每1000行切割test.txt文件
-d:添加数字后缀
-a:以3位数数字做尾数
test_:分割后的文件的前缀
升级版
split -l 1000 test.txt -d -a 3 test_split_&&ls|grep test_split_ | xargs -n1 -i {} mv {} {}.txt
在基础版的结果上,先执行ls命令,查找test_split_开头的文件,然后逐个重命名为.t