最终效果

1. 自定义表格样式

2. 自定义主题颜色

  • 支持三系普通颜色
  • 支持16色彩虹色
  • 支持单颜色

回顾一下shell语法

1. shell传递参数

我们可以在执行shell脚本时实时传递参数从而指定某些具体的参数(在本例中包括表格的样式、颜色等),脚本中获取参数的格式为$n。其中除n0表示执行的文件名外,1表示第一个参数,2表示第二个参数,以此类推。

  • 每一模式必须以右括号结束
  • 匹配到取值符合某一模式后,执行模式所有命令直到;;
  • 一旦模式匹配则不会执行其他模式
  • 如果无一模式匹配,可以使用*捕获该值
  1. case in
  2. 模式1)
  3. command1
  4. command2
  5. ...
  6. commandN
  7. ;;
  8. 模式2
  9. command1
  10. command2
  11. ...
  12. commandN
  13. ;;
  14. esac

在实例中,我们通过第一个参数指定style的值来选择不同的表格形式(具体的表格形式由制表符向量tbs实现)。另外当第一个参数以-h或者--h开头时,我们可以输出help信息:

  1. style="$1"
  2. case $style in
  3. # 根据第一个参数为-0或-1或-2来实现不同的表格样式, 即给tbs赋不同的值
  4. -0) tbs=" ";;
  5. -1) tbs="└┴┘├┼┤┌┬┐ ───│││";;
  6. -2) tbs="└─┘│┼│┌─┐ ───│││";;
  7. # 如果第一个参数以%开头, 意味着我们可以外部指定tbs的值
  8. # 把style变量开头的%去掉赋值给tbs
  9. "%"*) tbs="${style/"%"/}";;
  10. -h*|--h*)
  11. echo '
  12. \t [ --- HELP --- ]
  13. \t command : draw_table.sh [style] [colors] < <file >
  14. \t pipo : echo -e A\\tB\\na\\tb | draw_table.sh [style] [colors]
  15. \t [style] : input 16 characters
  16. \t 1~9 is Num. keypad as table,10 is not used
  17. \t 11~13 are left,middle,right in a row
  18. \t 14~16 are left,middle,right in a column
  19. \t
  20. \t [colors]: input a list,like "-3,-4,-8" sames "-green,-yellow,-white"
  21. \t It set color,table cross ,font ,middle. Or \\033[xxm .
  22. \t And support custom color set every characters of sytle
  23. \t Like "\\033[30m,-red,-yellow,,,,,,,,,,,,," sum 16.
  24. '
  25. exit
  26. ;;
  27. esac
  28. # ${var:-DEFAULT}: 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值
  29. tbs="${tbs:-"+++++++++,---|||"}"

2. awk命令

awk命令:依次对每一行进行处理,但是相比于sed更擅长取列,个人感觉是类SQL的文本搜索工具。

awk的基本形式如下:

  1. awk [-F|-f|-v] 'BEGIN{ 命令 } pattern{ 命令 } END{ 命令 }' file

参数:

  1. -F: 指定分隔符
  2. -f: 调用脚本
  3. -v: 使用var=value的格式定义变量

特殊变量:

  1. NF: 字段数量
  2. NR: 当前处理的行数
  3. FILENAME: 当前文件名

三个语句块:

  1. BEGIN{ 命令 }: 执行前的命令
  2. pattern{ 命令 }: 处理每一行执行的命令
  3. END{ 命令 }: 执行完所有行后的命令

3. 自定义输出颜色

格式如下:

  1. echo -e "\033[字背景颜色;字体颜色m字符串\033[0m"
  2. # 颜色调用始末是固定的:
  3. \033[ ; m …… \033[0m
  4. # 实例:
  5. echo -e "\033[41;36m someword \033[0m"

设计思路

1. 计算和绘制表格相关的全局变量

  • cols_len[NF]:存储了每一列的最大长度, 每列最大长度等于该列最长的元素的长度
  • rows[NR][NF]:将文件的每行每列的数据记录到rows二维数组中
  • rows[NR][0]rows0列存储前一行和后一行的列数, 用于确定当行的表格样式
  • colors[16]:存储每个制表符对应的着色方案
  • tbs[16]:存储已经着色的制表符,其中制表符样式类似于╚ ╩ ╝ ╠ ╬ ╣ ╔ ╦ ╗ , ═ ═ ═ ║ ║ ║,前1~9个为表格骨架的样式,第10表示着表格元素空格的填充,11~13分别表示上边框、中间和下边框的连接符,第14~16表示左边框、中间和右边框的连接符

2. 生成表格样式

由于涉及到单列,因此需要考虑到单列的情况生成如下一些表格样式变量:

  1. # ------------------------------------------预存所有的表格线, 减少不必要的重复计算------------------------------------------
  2. title_top = line_val("title_top")
  3. title_mid = line_val("title_mid")
  4. title_btm_mid = line_val("title_btm_mid")
  5. title_top_mid = line_val("title_top_mid")
  6. title_btm = line_val("title_btm")
  7. top = line_val("top")
  8. mid = line_val("mid")
  9. btm = line_val("btm")
  10. print "title_top: "title_top"\n"
  11. pring "title_mid: "title_mid"\n"
  12. print "title_btm_mid:"title_btm_mid"\n"
  13. print "title_top_mid:"title_top_mid"\n"
  14. print "title_btm: "title_btm"\n"
  15. print "top: "top"\n"
  16. print "mid: "mid"\n"
  17. print "btm: "btm"\n"

注意事项

MacLinux很多命令参数不同是因为Mac自带的是BSD系的命令,而Linux用的是GNU系的命令。可以在Mac中使用带g前缀的命令解决这一问题。

Linux下直接使用awk命令即可,在MAC下需要下载gawk命令,否则awk命令会一直报错。

  1. # 安装GNU工具链
  2. brew install coreutils
  3. brew install gawk

运行方法

  1. # 管道方法
  2. $ echo -e "A\tB\na\tb" | sh draw_table.sh
  3. +---+---+
  4. |,A,|,B,|
  5. +---+---+
  6. |,a,|,b,|
  7. +---+---+
  8. # 文件方法
  9. $ echo -e "Your Topic\nA\tB\tC\td\na\tb\th\ts\td\n5\n78\t34" > list.txt
  10. # 第一个参数控制表格形式
  11. $ sh draw_table.sh < list.txt
  12. +---------------------+
  13. |,,,,,Your Topic,,,, ,|
  14. +----+----+---+---+---+
  15. |,A,,|,B,,|,C,|,d,|,,,|
  16. +----+----+---+---+---+
  17. |,a,,|,b,,|,h,|,s,|,d,|
  18. +----+----+---+---+---+
  19. |,,,,,,,,,,5,,,,,,,,,,|
  20. +----+----+---+---+---+
  21. |,78,|,34,|,,,|,,,|,,,|
  22. +----+----+---+---+---+
  23. # 自定义模式
  24. # 自定义表格边框:需要用"%"开头,前9位表示表格边框,第10位没有用处,第11-13 表示行的上、中、下分隔符,第14-16表示列的左、中、右分隔符
  25. # 自定义颜色:第一个参数表示表格框架的颜色,第二个参数表示表格内容的颜色,第三个参数表示其他颜色
  26. # 最后可以传入16个颜色参数,表示style中每个字符的颜色
  27. $ sh draw_table.sh '%123456789 abcABC' -red,-blue,-green < list.txt
  28. 7aaaaaaaaaaaaaaaaaaaaa9
  29. A Your Topic C
  30. 4bbbb8bbbb8bbb8bbb8bbb6
  31. A A B B B C B d B C
  32. 4bbbb5bbbb5bbb5bbb5bbb6
  33. A a B b B h B s B d C
  34. 4bbbb2bbbb2bbb2bbb2bbb6
  35. A 5 C
  36. 4bbbb8bbbb8bbb8bbb8bbb6
  37. A 78 B 34 B B B C
  38. 1cccc2cccc2ccc2ccc2ccc3

代码

  1. #!/bin/bash
  2. #############################################################################
  3. # 作者:banemon
  4. # 邮箱:banemon@
  5. # 修改: tomocat
  6. # Git: https://gitee.com/banemon/linux_sh_script
  7. # 使用说明: https://zhuanlan.zhihu.com/p/144802861
  8. # 命令:sh draw_table.sh < file.txt 或 echo -e "A\tB\na\tb" | sh draw_table.sh
  9. # 帮助:draw_table.sh --help
  10. #############################################################################
  11. # 表格样式style
  12. style="$1"
  13. case ${style} in
  14. # tbs包含16个符号, 每个符号表示的含义如下:
  15. # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  16. # 1 2 3 4 5 6 7 8 9 txt_empt top_row mid_row btm_row left_col mid_col right_col
  17. -0) tbs=" ";;
  18. -1) tbs="└┴┘├┼┤┌┬┐ ───│││";;
  19. -2) tbs="└─┘│┼│┌─┐ ───│││";;
  20. -3) tbs="╚╩╝╠╬╣╔╦╗ ═══║║║";;
  21. -4) tbs="╚═╝║╬║╔═╗ ═══║║║";;
  22. -5) tbs="╙╨╜╟╫╢╓╥╖ ───║║║";;
  23. -6) tbs="╘╧╛╞╪╡╒╤╕ ═══│││";;
  24. -7) tbs="└┴┘├┼┤┌┬┐ ─ ─│ │";;
  25. -8) tbs="└─┘│┼│┌─┐ ─ ─│ │";;
  26. -9) tbs="╚╩╝╠╬╣╔╦╗ ═ ═║ ║";;
  27. -10) tbs="╚═╝║╬║╔═╗ ═ ═║ ║";;
  28. -11) tbs="╙╨╜╟╫╢╓╥╖ ─ ─║ ║";;
  29. -12) tbs="╘╧╛╞╪╡╒╤╕ ═ ═│ │";;
  30. -13) tbs="╘╧╛╞╪╡╒╤╕ ═ ═│ │";;
  31. -14) tbs="╚╩╝╠╬╣╔╦╗ ───│││";;
  32. -15) tbs="+++++++++ ---|||";;
  33. # 自定义表格边框:需要用"%"开头,前9位表示表格边框,第10位表示填充字符,第11-13 表示行的上、中、下分隔符,第14-16表示列的左、中、右分隔符
  34. # ${string/substring/replacement}: 使用$replacement, 来代替第一个匹配的$substring, 这里是去掉开头的%, 另外由于%是特殊字符需要加上双引号(或者反斜杠)
  35. "%"*) tbs="${style/"%"/}";;
  36. # 等价于: \%*) tbs="${style/\%/}";;
  37. -h*|--h*)
  38. # -e 参数激活转移字符, 比如\t表示制表符
  39. echo -e '
  40. \t [ --- HELP --- ]
  41. \t command : sh draw_table.sh [style] [colors] < <file>
  42. \t pipo : echo -e A\\tB\\na\\tb | draw_table.sh [style] [colors]
  43. \t [style] : input 16 characters
  44. \t 1~9 is Num. keypad as table,10 is not used
  45. \t 11~13 are up,middle,down in a row
  46. \t 14~16 are left,middle,right in a column
  47. \t
  48. \t -0 :
  49. \t -1 :└┴┘├┼┤┌┬┐ ───│││ -9 :╚╩╝╠╬╣╔╦╗ ═ ═║ ║
  50. \t -2 :└─┘│┼│┌─┐ ───│││ -10 :╚═╝║╬║╔═╗ ═ ═║ ║
  51. \t -3 :╚╩╝╠╬╣╔╦╗ ═══║║║ -11 :╙╨╜╟╫╢╓╥╖ ─ ─║ ║
  52. \t -4 :╚═╝║╬║╔═╗ ═══║║║ -12 :╘╧╛╞╪╡╒╤╕ ═ ═│ │
  53. \t -5 :╙╨╜╟╫╢╓╥╖ ───║║║ -13 :╘╧╛╞╪╡╒╤╕ ═ ═│ │
  54. \t -6 :╘╧╛╞╪╡╒╤╕ ═══│││ -14 :╚╩╝╠╬╣╔╦╗ ───│││
  55. \t -7 :└┴┘├┼┤┌┬┐ ─ ─│ │ -15 :+++++++++ ---|||
  56. \t -8 :└─┘│┼│┌─┐ ─ ─│ │
  57. \t
  58. \t [colors]: input a list,like "-3,-4,-8" sames "-green,-yellow,-white"
  59. \t It set color,table cross ,font ,middle. Or \\033[xxm .
  60. \t And support custom color set every characters of sytle
  61. \t Like "\\033[30m,-red,-yellow,,,,,,,,,,,,," sum 16.
  62. \t
  63. \t -1|-black -5|-blue
  64. \t -2|-red -6|-purple
  65. \t -3|-green -7|-cyan
  66. \t -4|-yellow -8|-white
  67. '
  68. exit
  69. ;;
  70. esac
  71. # 当没有参数时, 设定tbs的默认值
  72. tbs="${tbs:-"+++++++++,---|||"}"
  73. # 颜色
  74. color="$2"
  75. case $color in
  76. # 1~3可用于设置自己喜欢的自定义样式, 设置${color}的值即可
  77. 1) ;;
  78. 2) ;;
  79. 3) ;;
  80. "-"*|"\033"*)
  81. # 3位数标,词
  82. colors="$color"
  83. ;;
  84. "%"*) :
  85. # %号开头的全自定义
  86. colors="${color/"%"/}"
  87. ;;
  88. esac
  89. colors="${colors:-"-4,-8,-4"}"
  90. # 主体函数
  91. gawk -F '\t' \
  92. -v table_s="${tbs}" \
  93. -v color_s="${colors}" \
  94. 'BEGIN{
  95. }{
  96. # ------------------------------------------遍历每行记录全局变量------------------------------------------
  97. # cols_len[NF]: 存储了每一列的最大长度, 每列最大长度等于该列最长的元素的长度
  98. # rows[NR][NF]: 将文件的每行每列的数据记录到rows二维数组中
  99. # rows[NR][0]: 第0列存储前一行和后一行的列数, 用于确定当行的表格样式
  100. # max_single_col_length: 单列行的最大长度
  101. # ps: 由于单列是直接合并整行的单元格, 为图表美观(防止cols_len[1]因为某些特长的单列而增长), 单独记录单列的最大长度
  102. # 计算单列行的最大长度
  103. if (NF == 1) {
  104. max_single_col_length = max_single_col_length < super_length($1) ? super_length($1) : max_single_col_length
  105. rows[NR][1] = $1
  106. } else { # 非单列行更新每一列的最大长度
  107. for(i=1; i<=NF; i++){
  108. cols_len[i]=cols_len[i] < super_length($i) ? super_length($i) : cols_len[i]
  109. rows[NR][i]=$i
  110. }
  111. }
  112. # 前后行状态
  113. if (NR == 1) {PrevNF=0}
  114. # 每行第0列存储前一行和当前行的列数, 用于确定当行的表格样式
  115. rows[NR][0] = PrevNF "," NF
  116. PrevNF=NF
  117. }END{
  118. # ------------------------------------------colors变量着色, 生成colors和tbs变量------------------------------------------
  119. # 构建颜色向量: colors, 长度为16
  120. color_sum = split(color_s,clr_id,",")
  121. if (color_sum == 3){ # 简易自定义模式: 传入三种颜色
  122. for (i=1; i<=3; i++) {
  123. if (color_s ~ "-") {
  124. clr_id[i] = color_var(clr_id[i])
  125. }
  126. }
  127. # 组建色表: 三种颜色构造colors向量
  128. for (i=1; i<=16; i++) {
  129. if (i < 10) {
  130. colors[i] = clr_id[1]
  131. } else if (i == 10){
  132. colors[i] = clr_id[2]
  133. } else if (i > 10){
  134. colors[i] = clr_id[3]
  135. }
  136. }
  137. } else if (color_sum == 16){ # 全自定义模式: 传入16种颜色
  138. for (i=1; i<=16; i++){
  139. if(color_s ~ "-"){
  140. clr_id[i] = color_var(clr_id[i])
  141. }
  142. colors[i] = clr_id[i]
  143. }
  144. }
  145. # 设置颜色变量
  146. clr_end = "\033[0m" # shell着色的尾部标识
  147. clr_font = colors[10] # 第10位制表符的颜色, 也就是单元格内填充字符的颜色
  148. # 构建已着色的制表符向量: tbs, 长度16
  149. for (i=1; i<=length(table_s); i++){
  150. if(colors[i]=="")
  151. tbs[i] = substr(table_s, i, 1) # 获取第i个制表符
  152. else
  153. tbs[i] = colors[i] substr(table_s,i,1) clr_end # 给制表符着色, 例如红色 `\033[31m制表符\033[0m`
  154. fi
  155. }
  156. # ------------------------------------------如果单列长度大于非单列最大行长度则调整各列长度------------------------------------------
  157. max_line_len = 0 # 统计非单列的最大行长度
  158. for (i=1; i<=length(cols_len); i++) {
  159. max_line_len = max_line_len + cols_len[i] + 2 # 每列需要包含2个空格, 防止内容和制表符紧挨着
  160. }
  161. max_line_len = max_line_len + length(cols_len) - 1 # 多列的行最大总长度需要包含每列之间的制表符个数(列数 -1)
  162. # 如果单列最大总长度大于多列的行最大总长度时, 需要把超出的部分平均分给每列, 保证图表美观
  163. diff_length = max_single_col_length + 2 - max_line_len
  164. if (diff_length > 0) {
  165. for(j=1; j<=diff_length; j++){
  166. i = (j - 1) % length(cols_len) + 1
  167. cols_len[i] = cols_len[i] + 1
  168. }
  169. # 由于增加了每列长度, 故需要调整单列最大行长度
  170. # max_line_len = max_single_col_length + 2
  171. } else { # 如果单列最大总长度小于行的最大总长度, 那么单列长度要和最大行总长度保持一致
  172. max_single_col_length = max_line_len - 2
  173. }
  174. # ------------------------------------------预存所有的表格线, 减少不必要的重复计算------------------------------------------
  175. title_top = line_val("title_top")
  176. title_mid = line_val("title_mid")
  177. title_btm_mid = line_val("title_btm_mid")
  178. title_top_mid = line_val("title_top_mid")
  179. title_btm = line_val("title_btm")
  180. top = line_val("top")
  181. mid = line_val("mid")
  182. btm = line_val("btm")
  183. # debug
  184. # print "title_top: " title_top "\n"
  185. # pring "title_mid: " title_mid "\n"
  186. # print "title_btm_mid:" title_btm_mid "\n"
  187. # print "title_top_mid:" title_top_mid" \n"
  188. # print "title_btm: " title_btm" \n"
  189. # print "top: " top" \n"
  190. # print "mid: " mid" \n"
  191. # print "btm: " btm" \n"
  192. # ------------------------------------------绘制表格------------------------------------------
  193. row_num = length(rows)
  194. for(i=1; i<=row_num; i++){
  195. # 解析出前一行和当前行的列数
  196. split(rows[i][0], col_num_list, ",")
  197. prev_col_num = int(col_num_list[1])
  198. curr_col_num = int(col_num_list[2])
  199. # 绘制首行
  200. if (i==1 && prev_col_num == 0) {
  201. if (curr_col_num <= 1) {
  202. # 单列
  203. print title_top
  204. print line_val("title_txt", rows[i][1], max_single_col_length)
  205. } else if (curr_col_num >= 2) {
  206. # 多列
  207. print top
  208. print line_val("txt", rows[i])
  209. }
  210. } else if (prev_col_num <=1 ) {
  211. # 前一行为单列时
  212. if (curr_col_num <=1 ) {
  213. # 单列
  214. print title_mid
  215. print line_val("title_txt", rows[i][1], max_single_col_length)
  216. } else if (curr_col_num >= 2) {
  217. # 多列
  218. print title_btm_mid
  219. print line_val("txt", rows[i])
  220. }
  221. }else if (prev_col_num >= 2) {
  222. # 前一行为多列时
  223. if (curr_col_num <= 1) {
  224. # 单列
  225. print title_top_mid
  226. print line_val("title_txt", rows[i][1], max_single_col_length)
  227. } else if (curr_col_num >= 2) {
  228. # 多列
  229. print mid
  230. print line_val("txt", rows[i])
  231. }
  232. }
  233. # 表格底边
  234. if (i == row_num && curr_col_num <= 1) {
  235. # 尾行单列时
  236. print title_btm
  237. } else if (i == row_num && curr_col_num >= 2){
  238. # 尾行多列时
  239. print btm
  240. }
  241. }
  242. }
  243. # 返回字符串的长度, 支持中文等双字节字符
  244. # eg: 内置函数length("中文")返回2, super_length("中文")返回4
  245. function super_length(txt){
  246. leng_base = length(txt);
  247. leng_plus = gsub(/[^\x00-\xff]/, "x", txt) # 返回Ascii码大于255的字符匹配个数
  248. return leng_base + leng_plus
  249. }
  250. # color_var函数: 解析形如"-n"开头的颜色配置
  251. function color_var(color){
  252. if(color=="-1" ||color=="-black"){
  253. n=30
  254. }else if(color=="-2" || color=="-red"){
  255. n=31
  256. }else if(color=="-3" || color=="-green"){
  257. n=32
  258. }else if(color=="-4" || color=="-yellow"){
  259. n=33
  260. }else if(color=="-5" || color=="-blue"){
  261. n=34
  262. }else if(color=="-6" || color=="-purple"){
  263. n=35
  264. }else if(color=="-7" || color=="-cyan"){
  265. n=36
  266. }else if(color=="-8" || color=="-white"){
  267. n=37
  268. }else if(color=="-0" || color=="-reset"){
  269. n=0
  270. }else{
  271. n=0
  272. }
  273. return "\033[" n "m"
  274. }
  275. # ------------------------------------------生成绘制内容的函数------------------------------------------
  276. # 参数: part绘制的位置; txt绘制的文本内容; cell_lens绘制的单元格长度
  277. # eg: tbs为已着色的制表符 ╚ ╩ ╝ ╠ ╬ ╣ ╔ ╦ ╗ , ═ ═ ═ ║ ║ ║
  278. # TODO: cell_len, line, i这三个参数的意义何在, awk的特殊用法?
  279. function line_val(part, txt, cell_lens, cell_len, line, i) {
  280. # 更新本次行标
  281. if (part=="top") {
  282. tbs_l=tbs[7]
  283. tbs_m=tbs[8]
  284. tbs_r=tbs[9]
  285. tbs_b=tbs[11]
  286. } else if (part=="mid") {
  287. tbs_l=tbs[4]
  288. tbs_m=tbs[5]
  289. tbs_r=tbs[6]
  290. tbs_b=tbs[12]
  291. } else if (part=="txt") { # tbs[10]为填充字符, 用于填充单元格内的空格
  292. tbs_l=tbs[14] tbs[10]
  293. tbs_m=tbs[10] tbs[15] tbs[10]
  294. tbs_r=tbs[10] tbs[16]
  295. tbs_b=tbs[10]
  296. } else if (part=="btm"){
  297. tbs_l=tbs[1]
  298. tbs_m=tbs[2]
  299. tbs_r=tbs[3]
  300. tbs_b=tbs[13]
  301. } else if (part=="title_top"){
  302. tbs_l=tbs[7]
  303. tbs_m=tbs[11]
  304. tbs_r=tbs[9]
  305. tbs_b=tbs[11]
  306. } else if (part=="title_top_mid"){
  307. tbs_l=tbs[4]
  308. tbs_m=tbs[2]
  309. tbs_r=tbs[6]
  310. tbs_b=tbs[12]
  311. } else if (part=="title_mid"){
  312. tbs_l=tbs[4]
  313. tbs_m=tbs[12]
  314. tbs_r=tbs[6]
  315. tbs_b=tbs[12]
  316. } else if (part=="title_txt"){
  317. tbs_l=tbs[14] tbs[10]
  318. tbs_m=tbs[10] tbs[15] tbs[10]
  319. tbs_r=tbs[10] tbs[16]
  320. tbs_b=tbs[10]
  321. } else if (part=="title_btm"){
  322. tbs_l=tbs[1]
  323. tbs_m=tbs[13]
  324. tbs_r=tbs[3]
  325. tbs_b=tbs[13]
  326. } else if (part=="title_btm_mid"){
  327. tbs_l=tbs[4]
  328. tbs_m=tbs[8]
  329. tbs_r=tbs[6]
  330. tbs_b=tbs[12]
  331. }
  332. # title行只有一列文本
  333. if (part == "title_txt") {
  334. cols_count=1
  335. } else {
  336. cols_count = length(cols_len)
  337. }
  338. # 遍历该行所有列, 构造改行的内容
  339. line_content = ""
  340. # 对于一行内的每一个单元格, 计算单元格文本cell_txt 和 对应的空白字符填充数fill_len
  341. for (i=1; i<=cols_count; i++) {
  342. if (part == "txt") {
  343. # 多列左对齐
  344. cell_txt = txt[i]
  345. fill_len = cols_len[i] - super_length(cell_txt)
  346. }else if(part=="title_txt"){
  347. # 单列居中
  348. cell_txt = txt
  349. fill_len = (cell_lens - super_length(cell_txt)) / 2
  350. is_need_fix = (cell_lens - super_length(cell_txt)) % 2 # 如果填充字符长度非偶数则需要fix
  351. } else {
  352. cell_txt = ""
  353. fill_len = cols_len[i] + 2
  354. }
  355. # 单元格文本着色
  356. cell_txt = clr_font cell_txt clr_end
  357. # 单元格内空白补全
  358. if (part == "title_txt") {
  359. # 单列居中, 在单元格文本两侧补全空格字符
  360. for (cell_len=1; cell_len <= fill_len; cell_len++) {
  361. cell_txt = tbs_b cell_txt tbs_b
  362. }
  363. # 单列非偶长度补全
  364. if (is_need_fix == 1) {
  365. cell_txt = cell_txt " "
  366. }
  367. }else{
  368. # 多列左对齐
  369. for (cell_len=1; cell_len<=fill_len; cell_len++) {
  370. cell_txt = cell_txt tbs_b
  371. }
  372. }
  373. # 首格
  374. if (i == 1) {
  375. line_content = line_content cell_txt
  376. } else {
  377. # 中格
  378. line_content = line_content tbs_m cell_txt
  379. }
  380. # 尾格
  381. if ( i == cols_count ) {
  382. line_content = line_content tbs_r
  383. }
  384. }
  385. # 返回行: tbs_l表示最左侧的表格样式, line_content表示该行的内容
  386. return tbs_l line_content
  387. }
  388. '

使用实例

实际中经常碰到日志采集分析的问题,可以在shell脚本加入如下的语句用于可视化输出表格数据:

  1. echo -e "Module Log Analyse
  2. Function Name\tCount
  3. Function1\t20
  4. Function2\t1113
  5. Function3\t257
  6. Function4\t113" | sh draw_table.sh -4 -red,-white,-blue

Reference

[1] https://www.runoob.com/linux/linux-shell-process-control.html

[2] https://www.cnblogs.com/gaochsh/p/6901809.html

[3] https://www.cnblogs.com/nb-blog/p/5780424.html

[4] https://www.cnblogs.com/knowlegefield/p/7774693.html

[shell脚本]在Linux终端可视化输出表格数据的更多相关文章

  1. Shell脚本查看linux系统性能瓶颈(转)

    Shell脚本查看linux系统性能瓶颈(转自:http://blog.51cto.com/lizhenliang/1687612) [root@test ~]# cat show_sys_info. ...

  2. shell 脚本在linux中的应用

    shell脚本在linux中应用广泛,之前一直选用python写脚本来进行一些文件操作,但是最后发现shell脚本非常方便,所以特意来学习下皮毛,便于提高自己效率 定义变量 1 country=&qu ...

  3. shell脚本兼容linux/unix与windows/cygwin的基础(注意处理好CR, LF, CR/LF 回车 换行的问题)

    shell脚本兼容linux/unix与windows/cygwin的基础 :统一文本格式为:unix文本格式,即于LF为换行符(推荐方案) 在notepad上设置:编辑->档案格式转换-> ...

  4. 170509、文本编辑器编写的shell脚本在linux下无法执行的解决方法

    今天碰到一个奇怪的问题,编写好的shell脚本再linux上执行一直提示找不到文件或目录,后来想想是文本编辑器的问题,记录下来!!! 1.查看当前文本格式 Notepad++界面中,在右下角有文件格式 ...

  5. Shell脚本对Linux进行文件校验

    Shell脚本对Linux进行文件校验 一.需求 有客户等保需求对文件一致性进行校验,想到利用md5sum工具,因此写脚本来对文件进行自定义扫描,后期可以利用其进行校验,快速校验文件发现变更的文件,一 ...

  6. shell脚本计算Linux网卡流量

    本文介绍了计算linux网卡流量的一个shell脚本,一个通过固定间隔时间获取ifconfig eth0 的字节值而计算出网卡流量的方法,有需要的朋友参考下. 使用shell脚本计算Linux网卡流量 ...

  7. 2019.11.13课堂实验之用Linux下的shell脚本完成两文本交替输出

    有两个文本如下,实际中并不知道两文本各有多少行: 文本1.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ccccccccccccccccccccccccccc ...

  8. 使用 Shell 脚本自动化 Linux 系统维护任务

    如果一个系统管理员花费大量的时间解决问题以及做重复的工作,你就应该怀疑他这么做是否正确.一个高效的系统管理员应该制定一个计划使得其尽量花费少的时间去做重复的工作.因此尽管看起来他没有做很多的工作,但那 ...

  9. Shell 脚本实现 Linux 系统监控

    一.实验介绍 1.1 实验内容 本课程实现 shell 脚本监控系统的各项参数,并可以将脚本加入系统环境中,可以直接在终端里执行.还添加了几个参数,一个脚本可以执行不同的操作. 1.2 知识点 本实验 ...

随机推荐

  1. 移动端时间回显iphone出现的问题

    new Date(item.startTime.replace(/-/g, '/') dateFormat('hh:mm', new Date(item.startTime.replace(/-/g, ...

  2. 二分图最小点覆盖构造方案+König定理证明

    前言 博主很笨 ,如有纰漏,欢迎在评论区指出讨论. 二分图的最大匹配使用 \(Dinic\) 算法进行实现,时间复杂度为 \(O(n\sqrt{e})\),其中, \(n\)为二分图中左部点的数量, ...

  3. python进阶(4)文件操作

    文件操作 文件操作主要包括对文件内容的读写操作,这些操作是通过文件对象实现的,通过文件对象可以读写文本文件和二进制文件 open(file, mode='r', buffering=-1, encod ...

  4. 基于docker创建Cassandra集群

    一.概述 简介 Cassandra是一个开源分布式NoSQL数据库系统. 它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynam ...

  5. Java数组练习(打印杨辉数组)

    打印杨辉数组 package com.kangkang.array; import java.util.Scanner; public class demo02 { public static voi ...

  6. MySQL:事务机制

    为什么需要事务处理? 在执行SQL语句的时候,某些业务要求,一系列操作必须全部执行,而不能仅执行一部分. MySQL5.0后引入了事务机制,MySQL支持几种基本的数据库引擎,并非所有引擎都支持事务处 ...

  7. 不使用map和set实现LRU——那用List?

    遇到一道面试题,不使用map和set实现LRU,要求get的时间复杂度为O(logn),put的时间复杂度不超过O(n).想到了用ArrayList来实现,保存有序的key.然而牵涉add节点,在保证 ...

  8. Get和Post请求方式

    Get和Post是两种不同的类型的请求. 它们主要有3点不同. 1.get请求通过浏览器地址栏传递表单数据.post请求通过form data 传递数据,不会通过地址栏. 2.get请求安全性较低,p ...

  9. 虚拟机测试cobbler,网络安装加载最后出现 dracut:/#

    1.cobbler的几个重要概念: distro:发行版系统容,我理解为镜像来源,提供了kernel 和 initrd 文件以及repo源 profile:kickstart文件,用于定制系统,定制安 ...

  10. HDOJ-1029(简单dp或者排序)

    Ignatius and the Princess IV hdoj-1029 这里主要是先排序,因为要找出现了一半以上的数字,所以出现的数字一定在中间 方法一: #include<iostrea ...