Linux備忘録21:正規表現の(先読み、戻り読み、否定系)、ファイルディスクリプタで出力操作

Linux(bash)の個人的備忘録。

個人用サイトのため、非推奨の記述や誤りがあるかもしれません。ご了承ください。

GNU bash, バージョン 4.4.19(1)-release環境を使用

 

下の表は意味わかってない。とりあえず載せておく

自分的解釈ができたので、追記。

⇒検索文字列に+して(否定、肯定(含む))の&条件を付けられるような仕組み。

・名前(記述)      ・詳細
否定先読み(?!pattern)      開始位置から前を読んで、pattern がマッチしなければテストはパス

否定後読み(?<!pattern)      開始位置から後ろを読んで、pattern がマッチしなければテストはパス

肯定先読み(?=pattern)       開始位置から前を読んで、pattern がマッチすればテストはパス

肯定後読み(?<=pattern)     開始位置から後ろを読んで、pattern がマッチすればテストはパス

 

以下のような検索対象があるとする。

WindowsNT
WindowsVista
Windows2000
Windows3000

肯定先読み :Windows(?=[0-9]+)

⇒連続する数字を含むWindowsにマッチする。(この場合、"Windows2000"と”Windows3000"のWindowsにマッチする。)

●あくまでマッチはWindows部分のみとなるのが先読み、戻り読みを使用する理由。

 

否定先読み :Windows(?![0-9]+)

⇒連続する数字を含まないWindowsにマッチする。

(この場合、"WindowsNT"と”WindowsVista"のWindowsにマッチする。)

 

戻り読み参考例:

Windows1000
Windows3000
Mac2000
Mac1000

 

肯定戻り読み :(?<=Windows)[0-9]+

Windowsを含む連続数字にマッチする。

("Windows1000"と”Windows3000"の数字部分にマッチする。)

 

否定戻り読み :(?<!Windows)[0-9]+

Windowsを含まない連続数字にマッチする。

("Mac2000"と”Mac1000"の数字部分にマッチする。)

 


正規表現の否定形記述参考サイト
https://uxmilk.jp/50674
https://www-creators.com/archives/1827


【"Windows"を含まない行にマッチ】

^(?!.*Windows)(?!.*XP).*$

 

【"Windows"または"Mac"を含まない行にマッチ】

^(?!.*(Windows|Mac)).*$


【"Windows"を含むが、XPを含まない行にマッチ】

^(?=.*Windows)(?!.*XP).*$

※"?="は肯定先読みの意味


【"Windows"で始まらない行】

^(?!Windows).*$


【"Windows"で終わらない行】

^(?!.*Windows$).*$

 

 

【while文の中でreadコマンドを使用する】

whileで1行ずつ処理(readコマンドで読み込み)、さらにその中でreadコマンドを使用してループ処理の中でウィザード形式の処理を入れる。
    
    参考引用サイト:https://zvub.hateblo.jp/entry/20170218/1487385466
    ⇒まったく同じ内容でつまづいた。。。
    
    事象:普通にそのままやるとreadでの標準入力待ちが実施されない

    (⇒ループ処理内のreadに別の文字列が読み込まれてしまいスクリプト処理が止まらない。)


    原因:while readとループ処理のreadが、同じ1番のファイルディスクリプタ(標準入力)を使用しバッティングするため。
       ⇒上記サイト上でも記載があり、推奨方法では無いかもしれないが、とりあえずループ処理側のファイルディスクリプタを"3"に変更して回避する。

 

参考スクリプト記述
※ヒアドキュメントを1行ずつ読み込ませ,処理していく場合を例にする。

#!/bin/bash

while read -r LINE <&3 ←3から標準入力
do
    read -p "## KEY ENTER :" -r TEST ←ループ処理の中で、キーボード入力待ちの部分
    echo "${TEST}"
    echo "${LINE}"
done 3<<EOF ←出力先に"3"を指定。
aaaa
bbbb
cccc
EOF

●while文について、ファイルを直接読み込ませる場合①やパイプでつなぐ場合②でも上記にように出力先を変更しないと、readコマンドは入力待ちにならない。
①while read LINE;do {read ループ処理};done < "{ファイル名パス}"
②cat ~ | while read LINE;do {read ループ処理};done

 

【エラー出力をパイプで渡す】

♯ logrotate -v /etc/logrotate.conf 2>&1 | grep "/var/log/messages"

※コマンドの中には普通の出力がエラー出力になっているものが間々ある。"logrotate"のデバック動作はその一つ。デバック系のコマンドに多そうなイメージ。


【複数のファイルにリダイレクトする】
※+画面上には何も出力しない。

rpm -qa | tee -a {ファイル1} {ファイル2} > /dev/null ←teeの標準出力を捨てる


【エラーと標準を別ファイルに出力】

♯ ls -l >> info.txt 2>> err.txt

※例として追記リダイレクト">>"にしているだけ。上書きリダイレクトでも可。