seq與Shell序列生成


有時候可能有這樣的需要:用Shell生成類似0001這樣的序列作為批次號,這里整理了一下個人的方法

方法一:通過seq命令

seq命令可以生成從某個數字到遞增到另一數字的序列。用法如下:

# seq --help
Usage: seq [選項]  尾數
  or:  seq [選項]  首數 尾數
  or:  seq [選項]  首數 增量值 尾數
Print numbers from FIRST to LAST, in steps of INCREMENT.

選項參數如下:

  -f, --format=格式      use printf style floating-point FORMAT
  -s, --separator=字符串   用指定的字符串分割各序列值,默認分隔符為\n
  -w, --equal-width        使各序列值位數寬度相等,位數不夠的在前面用0補齊

示例1:指定序列格式

[root@bogon ~]# seq -f '%g' 2 6   ##沒有使用-f指定格式時,默認格式時%g,可以認為%g沒有指定任何格式
2
3
4
5
6
[root@bogon ~]# seq -f '%3g' 7 2 12  ##-f '%3g' 可以直接指定序列的寬度(3位數),這里不足的部分用空格補齊 
  7
  9
 11
[root@bogon ~]# seq -f '%03g' 7 2 12 ##-f '%03g' 可以指定序列寬度(3位數),不足的部分用0補齊
007
009
011
[root@bogon ~]# seq -f 'tmp_%g' 7 2 12  ##%前面也可以根據需要添加字符串,生成具有自己想要的前綴的序列
tmp_7
tmp_9
tmp_11

示例2:指定序列分隔符

[root@bogon ~]# seq -s , 2 6
2,3,4,5,6
[root@bogon ~]# seq -s "`echo -e "\t"`" 2 6
2    3    4    5    6

示例3:指定序列寬度,不足的位數用0補齊

[root@bogon ~]# seq -w 8 10   ##不設置步長
08
09
10
[root@bogon ~]# seq -w 1 3 10  ##設置步長
01
04
07
10

注:-f 可以直接指定序列的寬度,-w是將序列中的最大值的寬度作為序列的寬度;

  -f 和 -w 參數不能一起使用;

通過上面的例子可以發現,seq生成序列:簡單,能方便的生成序列,且序列的增量步長、序列之間的分隔符都可控,對於同一腳本中生成多個序列號的需求十分有效。

但是在實際中也有不足:若某個腳本要運行多次,若不做處理,批次號的初始值還是原來的初始值。這種情況下,個人的思路是通過已有文件的批次號的第一個非0字符后面的數字取出來,作為新的seq的起始值。

示例示例如下:

##獲取本次腳本第幾次執行,以生成批次號
if [ ! -f ${SPOOL_DIR}"tmp_"${v_date}"_000001.log" ];then
  V_START_NO=1
else
  V_START_NO=`ls -l ${TEST_DIR} | grep  "tmp_"${v_date} | awk '{print substr($9,24,6)}' | sort -n | tail -1 | sed 's/^0*//'`
  V_START_NO=$((V_START_NO+1))
fi

##每次操作一個文件
for v_batch_no in `seq -w ${V_START_NO} 100000 | head -1` ; do
  touch "tmp_"${v_batch_no}".log"
done

根據自己實際情況為准,這里的部分內容是自己改過的。

方法二:直接根據已有文件名后綴獲取

示例如下:

######生成批次號:6位數字,從000001開始,每次加1########
num=`ls -l ${TMP} | grep  TEST_${v_date} | awk '{print substr($9,24,6)}' | sort -n | tail -1 | sed 's/^0*//'`
if [ ! -f ${TMP}"TEST_"${v_date}"_000001".txt ];then
    v_batch_no="000001"
else
  tmp_num=$((num+1))
  v_batch_no=`printf "%06d\n" ${tmp_num}`
fi

 方法三:for遍歷指定的字符序列

示例如下:

[root@bogon tmp]# for i in {001..100};do echo $i;done
001
002
003(略)

這種方法也可以生成類似001這種序列號,但是比使用seq還是要差很多的。

本文原始地址:VNX - 博客園  http://www.cnblogs.com/chinas/p/7101887.html,轉載請注明出處,謝謝!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM