Linux備忘録21:正規表現の(先読み、戻り読み、否定系)、ファイルディスクリプタで出力操作
個人用サイトのため、非推奨の記述や誤りがあるかもしれません。ご了承ください。
⇒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"を含むが、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
※例として追記リダイレクト">>"にしているだけ。上書きリダイレクトでも可。