コマンド出力データから特定の列を選択/選択解除することが役に立つ場合もありますが、マンページにこれらの列が必ず名前でリストされるわけではありません。これらの名前をどのように見つけることができますか? 例えば 2 つのコマンドを実行して出力を表示します。 $ sudo journalctl -eu NetworkManager -o short
Feb 06 06:52:56 user NetworkManager[713]: [1707206156.8193] device (tun0): state change: ip-check -> secondaries (reason 'none', sys-iface-state: 'external')
Feb 06 06:52:56 user NetworkManager[713]: [1707206156.8195] device (tun0): state change: secondaries -> activated (reason 'none', sys-iface-state: 'external')
Feb 06 06:52:56 user NetworkManager[713]: [1707206156.8207] device (tun0): Activation: successful, device activated.
この出力には、6つの異なる列(強調表示のために類似名が付けられています)が含まれているようです。 日付、ユーザー、プロセス、タイプ、日付2、メッセージ 2番目のコマンドを実行すると、列にlsblk名前が割り当てられていることがわかります。 $ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
zram0 253:0 0 7.3G 0 disk [SWAP]
nvme0n1 259:0 0 238.5G 0 disk
--output以下を実行して必要な列を選択できます。columns $ lsblk --output NAME,SIZE
NAME SIZE
zram0 7.3G
nvme0n1 238.5G
man lsblkページは、他の多くのコマンドが提供しない列のヘルプを提供します。 -o, --output list
Specify which output columns to print. Use --help to get a list of all supported columns. The columns may affect tree-like output. The default is to
use tree for the column 'NAME' (see also --tree).
The default list of columns may be extended if list is specified in the format +list (e.g., lsblk -o +UUID).
マンページにリストされていない場合(選択または見つからない場合)、どのように列を識別して名前を付けますか?
与えられた bash 環境変数の設定: $ declare -g bs=$'\\' bsbs=$'\\\\' q="'";
この正規表現は、一重引用符("'")テキストのシーケンスと正確に一致します。ここで、これらのテキストにはエスケープされた一重引用符を含めることができます。 "[${bs}${q}]((([^${bsbs}]?[^${bs}${q}])|(${bsbs}${bs}${q}))+)[${bs}${q}]"
$ echo "[${bs}${q}]((([^${bsbs}]?[^${bs}${q}])|(${bsbs}${bs}${q}))+)[${bs}${q}]"
[\']((([^\\]?[^\'])|(\\\'))+)[\']
(「[\ ']」の逆引用符は必ずしも必要ではありませんが、誰かがこの値を一重引用符で囲んだ文字列にエンコードしようとすると、明確にするために含まれます。) 問題は、これをエスケープ引用符で一般化する最善の方法と、入力エスケープ文字が奇数の長さ((n&1)== 1)サイズ(バイト数)の場合にのみ、複数のエスケープシーケンスの実行を処理する方法です。最後のエスケープはACTIVEで、最後の文字はINACTIVE(文字列の一部)です。それ以外の場合(エスケープ回数は偶数((n&1)==0))、文字列にはエスケープ回数の半分が含まれます(n>> 1)。最後の文字はACTIVE(つまりエスケープされていません)です。 また、sedとgrep / egrepにはいくつかの問題があります。 o一致するサブグループは、後続の「\ 1+」グループ番号を占めることで数字を増やすことができます。 - 後続グループが一致しない場合 - 理想的には、後続のサブグループ番号に影響を与える可能性があるサブグループなしでこの正規表現を表現できることを願っています。 o エスケープ番号をまったく処理せず、 エスケープ番号による参照もエスケープされないことを認識しません。 だから私の質問は次のようになります glibcサポートPOSIX REまたはgrep / sed REのみを使用してこれらの問題を解決するための最良の方法は何ですか? つまり。 RegExp内で、任意の長さの奇数(有効なエスケープ)または偶数(誤ったエスケープ)長のエスケープシーケンスを認識することを許可しますか? 私はPOSIX REがこの種の問題を処理するために、次の特殊な構文の利点を享受できると思います。 [\\]{1,}\#&1\?$A\:$B
ここで '}#&1' は前の [\]{...} グループ 'x & 1' と一致する要素数のテストを意味し、 ?x:y は "最後のテストが true なら x を置き換えます。場合は、xを置き換えます」を意味します。 REのy」。 これにより、実際にはRegExp解析文字列内のすべてのエスケープの数に関係なく、簡単かつ安全に処理できます。このような新しいRE構文なしでこれを行うには? RegExp式のみを使用することは不可能でも実行不可能でもありませんが、非常に困難です。 それとも私が間違っていますか? これで、最新のPOSIX REで以前のセットの実行長に対して算術を実行する簡単な方法はありますか? 例1: $ declare -g bs=$'\\' bsbs=$'\\\\' q="'";
$ echo "'a quot\\'d string' 42" | sed -r 's/'"[${bs}${q}]((([^${bsbs}]?[^${bs}${q}])|(${bsbs}${bs}${q}))+)[${bs}${q}]"'[[:space:]]([0-9]+)/\1\t:\t\2/'
'a quot'd string : g
例2: $ echo "'a quot\\'d string' 42" |
sed -r 's/'"[${q}]((([^${bsbs}]?[^${q}])|(${bsbs}${q}))+)[${q}]"'[[:space:]]([0-9]+)/\1\t:\t\2/'
a quot\'d string : g
@rowboatが言及した$ {bs} -esがどのように削除されたかを確認してください。結果は、$bsbs の代わりに $bs を使用した結果と同じです。 $ echo "'a quot\\'d string' 42" | sed -r 's/'"[${q}]((([^${bs}]?[^${q}])|(${bs}${q}))+)[${q}]"'[[:space:]]([0-9]+)/\1\t:\t\2/'
a quot\'d string : g
結論として: 私はglibc、PCRE、PERL、cl-ppcre(SBCLのCommon Lisp REライブラリ)とEmacsのREライブラリによって提供される「regex(7) - POSIX.2正規表現」ライブラリの非POSIX拡張を開発しています。 o 名前付き POSIX 文字クラス (例: '[[:spaceesc:]]' または '[^[:space-esc:]]' または '[[) の接尾辞 "-esc" または "esc" の意味を定義します。 : quote-esc:]]' これは通常、文字クラス 'X' のメンバーである文字が文字クラス '${X}esc' ('${X}- の同義語) のメンバーではないことを意味します。 esc') IFFの前に出ます。奇数のエスケープ文字 ('\':ASCII "\x5c" ) があります。 All character sequences that are subject to an :*esc: character
class test will have legal '\\' , '\xXX', '\0OOO', or '\Uxxxxxx' or
'\uXXXX' sequences replaced by :
ASCII:\x5c , ASCII:\xXX (where XX are hex digits),
ASCII:\OOO (where OOO are Octal digits) ,
24-bit unicode value with code point xxxxxx (x: hex digit) , and
16-bit unicode value with code point xxxx (x: hex digit) ,
respectively.
Also '[[:quote:]]' and '[[:quoteesc:]]' classes must be
supported that select characters (or non-escaped chars)
with the Unicode 'Quotation Mark' binary attribute, and
'[[:punct:]]' or '[[:punctesc:]]' would similarly apply
to all (non-escaped) chars which have the Punctuation attribute.
Perhaps a similar '*cesc' or '*escc' character class suffixes
could be provided that support also the C escapes:
'\n','\r','\t','\v','\b','\l'... etc.
If the /
Linuxでは、次のファイルコンテンツ検索コマンドが必要です。 md、txt、htm などの指定されたファイルを検索します。 フォルダとそのサブフォルダで繰り返し実行します(例:)。 コンテンツ検索は正規表現パターンである可能性があります(例:tomat。* es)。 一致する項目の周囲のテキストを出力します。 出力は次の形式です。、各ファイルを空行で区切ります。 file1
lineNr1:text1
lineNr2:text2
file2
lineNr1:text1
lineNr2:text2
6/最後の基準である出力は視覚的に明確でなければなりません。したがって、端末でgrepなどのカラースキームを使用してください。 ファイルの色はcolor_1(紫色など)です。 color_2のlineNr(例:緑) テキスト出力の場合: color_3のテキストを一致させます(例:赤)。 残りのテキストはcolor_4です(たとえば、白)。 もともと、grepはこれを行いますが、出力形式を変更したいと思います。、今すぐ: file1:lineNr1:text1
file1:lineNr2:text2
file2:lineNr1:text1
file2:lineNr2:text2
私が望むのは検索結果に集中することですが、ディレクトリ検索を行うときに検索結果の前にファイルパス名があると検索がより複雑になります。ファイルに一致する項目が複数ある場合。私が望むのは、各ファイルが自分が探しているものを直接見ることができることです。ファイル、サブフォルダ、一致が多いほど、明確なフォーカスが重要になります。 したがって、grepは長い出力を提供し、フォーカスを失います。おそらくgrepコマンドの新機能として要求する必要があります。 欲しいものに近いです。 test.txtに次の2つの文があるとします。 2023-09-25: after colon char does not output the sentence.
2023-09-25 outputs line as there is NO colon preceding match.
次に、次のcliを実行します。 grep -rwn --include=\*.{md,txt} -ie "output.*" --color=always | awk -F: '{if(f!=$1)print "\n"$1; f=$1; print $2 ":" $3;}'
この例では、1行目の出力は「:」で停止し、2行目では美しい出力が表示されます。添付ファイルを参照 したがって、一致するテキストにコロン ":" が含まれていない場合、このクエリは操作を実行します。一致の周りにテキスト出力がないため、検索出力の使い勝手が悪くなります。 より複雑な例(txtファイルを添付できません): utf-8 encoded
# We're interested in searching on the word: tomato or tomate in french
In markdown file it can be put in bold using **tomatoes**
In a html file, content is full of tags, put a word in bold can be put in many way, such as tomato
Let's see what the search will return on these combinations:
1. At 6:45 will eat tomato soup.
2. Tomatoes were cooked for the soup recipe, but what time do we eat tomato soup? Isn't it six forty-five, aka 6:45?
3. Tomate en français
4. tomates: pluriel du mot tomate.
Could be tricky to restrict search only on bilingual TOMATO's variation, as for instance in automatically, there is auTOMATically.
Regular expression are of help.
一致が2つのサブフォルダにあると仮定すると、このCLIは次のように明確に説明します。 grep -rn --include=\*.{md,txt} -iP "tomat[eo]s*" --color=always | awk -F: '{if(f!=$1)print "\n"$1; f=$1; print $2 ":" $3;}'
ただし、追加出力コロン文字 ":" 以降の内容は出力には現れません。、コロン ":" を ";" に変更すると、違いを見ることができます。 grep出力と比較 出力検索結果をプレーンテキストファイルにダンプしようとすると、カラースキームが失われると視覚情報が失われます。したがって、タグを含むhtmlファイルは色情報を回復します。これは、次のhtml出力で実行できます。:
file_1
lineNr1:beginning of surrounding matchSEARCH_PATTERNend of surrounding match lineNr2:beginning of surrounding matchSEARCH_PATTERNend of surrounding match
file_2
lineNr1:beginning of surrounding matchSEARCH_PATTERNend of surrounding match lineNr2:beginning of surrounding matchSEARCH_PATTERNend of surrounding match
次のファイルがあります。 xxxxx,aaaaaa,abab21323,ccccccc
ファイルに変数として指定された文字列が含まれている場合は、特定のコマンドを実行するスクリプトが必要です。それ以外の場合は、別のコマンドを実行してください。 これは私のbashコードです。 #!/bin/bash
var1=$1
if grep -Fq "$var1" Agenda.txt
then
## SOME COMMANDS
else
## SOME OTHER COMMANDS
fi
動作しますがawk。