org-babel有趣的事

1 数据格式化(:wrap)

1.1 json格式化

#+BEGIN_SRC sh :results code :wrap SRC js :exports both
  curl http://httpbin.org/get
#+END_SRC

#+RESULTS:
#+BEGIN_SRC js
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Connection": "close",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.47.0"
  },
  "origin": "180.167.20.58",
  "url": "http://httpbin.org/get"
}
#+END_SRC

1.2 其他格式化

#+BEGIN_SRC sh :wrap QUOTE :results raw :exports both
  date
#+END_SRC

#+RESULTS:
#+BEGIN_QUOTE
Fri Nov  3 23:05:34 CST 2017
#+END_QUOTE

2 变量设置在Header中

** 变量设置在Header中
   :PROPERTIES:
   :ID:       d7b197d7-f925-47b7-bcc0-37e182761619
   :header-args:shell: :var host="google.com" :results pp :session brantou :exports both
   :END:
   #+BEGIN_SRC shell
     ping $host -c 2
   #+END_SRC

   #+RESULTS:
   :
   : $ PING google.com (192.168.83.230) 56(84) bytes of data.
   : 64 bytes from 192.168.83.230: icmp_seq=1 ttl=128 time=9.60 ms
   : 64 bytes from 192.168.83.230: icmp_seq=2 ttl=128 time=25.4 ms
   :
   : --- google.com ping statistics ---
   : packet loss, time 1001ms
   : rtt min/avg/max/mdev = 9.609/17.508/25.408/7.900 ms

   覆盖变量 *host* 和 *session* 置为空!
   #+BEGIN_SRC shell :var host="baidu.com" :session none
     ping $host -c 2
   #+END_SRC

   #+RESULTS:
   : PING baidu.com (111.13.101.208) 56(84) bytes of data.
   : 64 bytes from 111.13.101.208: icmp_seq=1 ttl=128 time=35.5 ms
   : 64 bytes from 111.13.101.208: icmp_seq=2 ttl=128 time=49.2 ms
   :
   : --- baidu.com ping statistics ---
   : 2 packets transmitted, 2 received, 0% packet loss, time 1002ms
   : rtt min/avg/max/mdev = 35.517/42.361/49.206/6.847 ms

3 结果的预处理(:post)

#+NAME: img_wrap
#+BEGIN_SRC python :var img_path="" :results output
  img_path=img_path.replace('[[file:..', '').replace(']]', '')
  print('<img src="'+img_path+'" />')
#+END_SRC

#+HEADER: :file ../images/devOps/just-try-post.png :exports both
#+BEGIN_SRC plantuml :mkdirp yes :post img_wrap(img_path=*this*) :wrap EXPORT html
  @startuml
  cli -> serv:  auth req
  serv --> cli: auth res
  @enduml
#+END_SRC

#+RESULTS:
#+BEGIN_EXPORT html
<img src="/images/devOps/just-try-post.png" />
#+END_EXPORT

4 noweb的引用(:noweb-ref)

#+HEADER: :tangle ../src/devOps/noweb_ref.sh :mkdirp yes
#+BEGIN_SRC shell :noweb yes :shebang #!/bin/sh
  <<fullest-disk>>
#+END_SRC

** the mount point of the fullest disk
   :PROPERTIES:
   :header-args:shell: :noweb-ref fullest-disk
   :END:

*** query all mounted disks
    #+BEGIN_SRC shell
        df \
    #+END_SRC
*** strip the header row
    #+BEGIN_SRC shell
        |sed '1d' \
    #+END_SRC
*** sort by the percent full
    #+BEGIN_SRC shell
        |awk '{print $5 " " $6}' | sort -n | tail -1 \
    #+END_SRC
*** extract the mount point
    #+BEGIN_SRC shell
      |awk '{print $2}'
    #+END_SRC

tangle出的代码如下:

#!/bin/sh
df \
|sed '1d' \
|awk '{print $5 " " $6}' | sort -n | tail -1 \
|awk '{print $2}'

5 预处理/后置操作(:prologue/:epilogue)

在做相关操作时,可能需要预先初始化,同时又不想这些初始化过程出现在代码流程中,
这个时候你可使用 *:prologue* 来关联相关语句来达到预处理的效果。
#+NAME: prologue-example
#+BEGIN_SRC shell :prologue "echo yep; exit 0" :exports both
  echo "nope"
#+END_SRC

#+RESULTS: prologue-example
: yep

*:epilogue* 正好和 *:prologue* 完成的功能相反,用于后置处理,完成清理工作。
#+BEGIN_SRC shell :epilogue "exit 0; echo yep" :exports both
  echo "nope"
#+END_SRC

#+RESULTS:
: nope

6 批量执行

可在命令行中调用代码块实现的函数,如下面所示:

#!/bin/sh
# -*- mode: shell-script -*-
#
# tangle files with org-mode
#

DIR='pwd'
FILES=""
# wrap each argument in the code required to call tangle on it
for i in $@; do
    FILES="$FILES \"$i\""
done

emacs -Q --batch \
      --eval "(progn
(require 'org)(require 'ob)(require 'ob-tangle)
(mapc (lambda (file)
       (find-file (expand-file-name file \"$DIR\"))
       (org-babel-tangle)
       (kill-buffer)) '($FILES)))" 2>&1 | grep tangled

7 连接mysql

#+BEGIN_SRC sql
  show tables;
#+END_SRC

#+RESULTS:
| Tables_in_mysql           |
|---------------------------|
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |

#+BEGIN_SRC sql
  SELECT host, user FROM user WHERE 1;
#+END_SRC

#+RESULTS:
| host      | user             |
|-----------+------------------|
| %         | brantou          |
| localhost | debian-sys-maint |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
Last Updated 2017-12-05 Tue 23:20.
Render by hexo-renderer-org with Emacs 25.3.2 (Org mode 8.2.10)