[shell]【转载+批注】简单实用 shell 中拆分文件每

2020-03-20  本文已影响0人  Silver_42ac

原文章:
使用shell 切割文件中每行,获取每行的数组的最后一个值
作者:南瓜demi

#/bin/bash
while read line
do
    #str=$(echo $line|tr "/","\n")
    #echo $line
    OLD_IFS=$IFS   #保存原始值
    IFS="/"        #改变IFS值
    arr=($line)   
    IFS="$OLD_IFS"   #还原IFS原始值
    for i in ${arr[@]}; #遍历数组
    do
        #echo $i
        key=${arr[@]: -1}
        echo $key
        sort access.log |grep "${key}" > ${key}.log
        break
    done

done < serverApiBak.txt;

脚本中使用到的知识点

1、IFS

IFS的介绍
[<u style="word-break: break-all; line-height: normal !important;">Shell</u>](javascript:;) 脚本中有个变量叫IFS(Internal Field Seprator) ,内部域分隔符。完整定义是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.
Shell 的环境变量分为set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了env 变量,但set变量不一定都是env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。
IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

IFS 实例:

1 查看IFS的值

echo "$IFS"
echo "$IFS"|od -b 0000000 040 011 012 012  0000004

直接输出IFS是看不到值的,转化为二进制就可以看到了,"040"是空格,"011"是Tab,"012"是换行符"\n" 。最后一个 012 是因为 echo 默认是会换行的。
2 实际中的应用

#!/bin/bash
OLD_IFS=$IFS #保存原始值
IFS="" #改变IFS的值
IFS=$OLD_IFS #还原IFS的原始值

#遍历数组
str=[aa,bb,cc]
for i in ${str[@]};
do
    echo $i
done

#获取数组中最后一个元素的值
echo ${str[@]: -1} 注意冒号后有空格

对于xxx/xxx/aaa/ 路径 获得最后一个目录的名字,可以用 basename

 basename xxx/xxx/aaa/ 
#返回aaa,linux 下可一直直接试下

#shell 脚本中赋值
name=$( basename xxx/xxx/aaa/)
echo $name

补充作者说用awk 更简单 ,确实 awk 中有个-F 参数 以及 FS 对应 IFS 是相同的作用

echo  "xxx/xxx/aaa/"  | awk -F "/" '{print $3;}'
echo  "xxx/xxx/aaa/"  | awk 'BEGIN{FS="/"}{print $3;}' 

AWK 中 NF 表示 分裂的元素个数,可以用来 获取数组中最后一个元素的值

注意"xxx/xxx/aaa"最后是否有一个分隔符/.如果有 最后一个元素是"/" 后的内容,空的
echo  "xxx/xxx/aaa"  | awk -F '/'  '{print $NF}' 

echo  "xxx/xxx/aaa/"  | awk -F'/'  '{print $(NF-1)}'

其它附录

            lib_name=$(echo ${cell_name} | cut -d '-' -f 4) #Pxxxx
            OLD_IFS=$IFS #保存原始值
            IFS="/" #改变IFS的值
            array=($obs_dir)
            IFS=$OLD_IFS #还原IFS的原始值
            if ${#array[@]} > 8 ;then
                lib_name=$(basename ${obs_dir}) #Pxxxx
            fi
上一篇下一篇

猜你喜欢

热点阅读