查看未使用oid脚本unused_oids解析

首先上运行效果,有个直观认识:

查看未使用oid脚本unused_oids解析_第1张图片

简要说明:从src/include/catalog目录下的pg_*.h toasting.h indexing.h中获取所有已经使用的oid,最后将2--FistBootstrapObjectId-1(即10000-1)之间的未使用的id打印出来。其中涉及管道符使用,正则表达式,更有许多有用的linux小命令,譬如grep(egrep),sed,tr,sort,uniq,awk,都是一些常用的命令(所以对于初学者这个shell学习价值还蛮高)。

逐行简单解释如下:

/*一堆注释,自己阅读,有助于英文提升!*/
AWK="awk" # 定义变量awk

# Get FirstBootstrapObjectId from access/transam.h
FIRSTOBJECTID=`grep '#define[   ]*FirstBootstrapObjectId' ../access/transam.h | $AWK '{ print $3 }'`
export FIRSTOBJECTID # 从../access/transam.h文件中找到FirstBootstrapObjectId并取到它的值

# this part (down to the uniq step) should match the duplicate_oids script
# note: we exclude BKI_BOOTSTRAP relations since they are expected to have
# matching DATA lines in pg_class.h and pg_type.h
# 将CATALOG(.*BKI_BOOTSTRAP这一行去掉是因为在pg_class.h和pg_type.h中DATA行肯定会匹配到这些OID

cat pg_*.h toasting.h indexing.h | \ #从这些文件中查找
egrep -v -e '^CATALOG\(.*BKI_BOOTSTRAP' | \ #去除CATALOG开头后面接(BKI_BOOTSTRAP的行
sed -n  -e 's/^DATA(insert *OID *= *\([0-9][0-9]*\).*$/\1/p' \
        -e 's/^CATALOG([^,]*, *\([0-9][0-9]*\).*BKI_ROWTYPE_OID(\([0-9][0-9]*\)).*$/\1,\2/p' \
        -e 's/^CATALOG([^,]*, *\([0-9][0-9]*\).*$/\1/p' \
        -e 's/^DECLARE_INDEX([^,]*, *\([0-9][0-9]*\).*$/\1/p' \
        -e 's/^DECLARE_UNIQUE_INDEX([^,]*, *\([0-9][0-9]*\).*$/\1/p' \
        -e 's/^DECLARE_TOAST([^,]*, *\([0-9][0-9]*\), *\([0-9][0-9]*\).*$/\1,\2/p' | \
        # 根据正则表达式匹配,并将行替换为oid(,oid)形式,其他无关字符去掉
tr ',' '\n' | \ # 将,替换为换行符
sort -n | \ # 对结果按数值排序
uniq | \ # 去掉临近的重复行
$AWK ' # 以下将上述内容使用awk用漂亮的方式显示出来(单独的直接显示,连续的用 x - y 方式,有多漂亮。。。)
BEGIN {
        last = 0;
}
/^[0-9]/ {
        if ($1 > last + 1) {
                if ($1 > last + 2) {
                        print last + 1, "-", $1 - 1;
                } else {
                        print last + 1;
                }
        }
        last = $1;
}
END {
        print last + 1, "-", ENVIRON["FIRSTOBJECTID"]-1;

cat至结尾部分可以通过一步一步执行进行调试理解:

查看未使用oid脚本unused_oids解析_第2张图片

请逐一对使用到的linux命令进行学习,然后才能比较容易、深刻的理解!

要想进一步了解pg关于oid的源码(很有必要),请移步参考中德哥网易博客!

参考:

linux sed

linux grep

linux awk

linux sort+uniq

OID源码分析by德哥

你可能感兴趣的:(linux,shell,PostgreSQL,内核)