[20190108]rlwrap sqlplus tee相關問題.txt

lfree發表於2019-01-08

[20190108]rlwrap sqlplus tee相關問題.txt


--//這個問題一直困擾我很久.如果我執行:

rlwrap sqlplus scoott/book | tee -a aa.txt


--//這樣sqlplus視窗有1個小毛病,就是提示符要回車才顯示,有什麼好方法解決這個問題.實際上就是tee快取一行沒有輸出.

--//向一些命令都有1個規避快取的命令列引數.比如tcpdump 的-l引數,sed -u引數.

--//而tee沒有引數控制這樣的行為.

--//expect包裡面包含一個unbuffer,可以禁止輸出快取.

--//一些新版本linux版本的coreutils包裡面包括一個命令stdbuf(Red Hat Enterprise Linux Server release 7.5就有這個命令)

--//我自己也做了一些嘗試,都是不行,如下方式不行.


$ rlwrap sqlplus sys as sysdba | stdbuf -i0 -o0 -e0 tee -a /tmp/aa.txt

$ rlwrap  sqlplus scott/book | unbuffer -p tee -a /tmp/aa.txt


--//開始看rlwrap文件,我發現實際rlwrap提供filter功能.充分利用這個功能就可以實現:


# rlwrap -z listing

The following filters can be found in  /usr/local/share/rlwrap/filters

count_in_prompt                replace prompt by simple counter

ftp_filter                     run plain Netkit ftp with completion for commands, local and remote files

history_format                 Append <format> to every history item, and strip it off again when input is accepted

logger                         log messages to a file (for debugging)

null                           a filter that does nothing

paint_prompt                   paint the prompt in colour gradient between X11 colours <colour1> and <colour2>

pipeline                       combines the effects of 2 or more filters

pipeto                         Allow piping of <command> output through pagers or other shell commands

scrub_prompt                   removes all junk from prompt

simple_macro                   simple on-the-fly macro processing

template                       filter template

unbackspace                    remove backspaces from output


--//做了嘗試不行.開始google,百度.發現如下連結,裡面提供一個outfilter指令碼.連結如下:

--//


# cd /usr/local/share/rlwrap/filters

# vim outfilter

#! /usr/bin/perl

use lib ($ENV{RLWRAP_FILTERDIR} or ".");

use RlwrapFilter;

use strict;


my $filter = new RlwrapFilter;

my $name = $filter->name;


my $filter_command = join ' ', @ARGV;


$filter->help_text("Usage: rlwrap -z '$name <filter-command>' <command>\n"

                   . "Filter <command> output through <filter-command>");


$filter->output_handler(sub {""});

$filter->prompt_handler(\&prompt);

$filter->run;


sub prompt {

    my $prompt = shift;


    my $output = $filter->cumulative_output;

    $output =~ s/\r//g;


    open (PIPE, "| $filter_command")

        or die "Failed to create pipe: $!";

    print PIPE $output;

    close PIPE;


    return $prompt;

}


# chmod 755  outfilter


$ rlwrap -z 'outfilter tee -a /tmp/aa.txt'  sqlplus scott/book

--//現在沒有問題了.

--//利用這個功能透過/tmp/aa.txt實現過濾功能.


--//例如在另外的終端執行如下,終端2:

$ tail -f /tmp/aa.txt |grep -i SUPP


--//在終端1 sqlplus下執行:

SCOTT@book> @ desc v$database ;


--//終端2輸出如下:


   30      SUPPLEMENTAL_LOG_DATA_MIN                VARCHAR2(8)

   31      SUPPLEMENTAL_LOG_DATA_PK                 VARCHAR2(3)

   32      SUPPLEMENTAL_LOG_DATA_UI                 VARCHAR2(3)

   40      SUPPLEMENTAL_LOG_DATA_FK                 VARCHAR2(3)

   41      SUPPLEMENTAL_LOG_DATA_ALL                VARCHAR2(3)

   51      SUPPLEMENTAL_LOG_DATA_PL                 VARCHAR2(3)


--//這樣就是知道那個欄位對應位置,ctrl+c,然後執行如下:


$ tail -f /tmp/aa.txt |cut -d"|" -f1,2,30,31,32,40,41,51


--//終端1執行如下:

SCOTT@book> set linesize 3000

SCOTT@book> set colsep |

SCOTT@book> select * from v$database ;


--//終端2可以看到輸出如下:


      DBID|NAME                |SUPPLEME|SUP|SUP|SUP|SUP|SUP

----------|--------------------|--------|---|---|---|---|---

1337401710|BOOK                |NO      |NO |NO |NO |NO |NO



--//這樣就可以實現類似我以前連結寫的功能:http://blog.itpub.net/267265/viewspace-2285749/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2375095/,如需轉載,請註明出處,否則將追究法律責任。

相關文章