時には、次のls出力形式のファイルを取得します。
/etc/cron.d:
-rw-r--r-- 1 root root 128 May 15 2020 0hourly
-rw------- 1 root root 235 Dec 17 2020 sysstat
/etc/cron.daily:
-rw------- 1 root root 235 Dec 17 2020 sysstat
一般的なGnuツールを使用するか、bashの内部を削除してそれを操作する機会がありますか?
-rw-r--r-- 1 root root 128 May 15 2020 /etc/cron.d/0hourly
-rw------- 1 root root 235 Dec 17 2020 /etc/cron.d/sysstat
-rw------- 1 root root 235 Dec 17 2020 /etc/cron.daily/sysstat
素晴らしいです。
最も簡単な方法は、次のようにファイルパスを削除することです。
cat <filename> | grep -v -E "^\/[a-z]"
しかし、私が言ったように、このパスをファイル名の後続行にどのように移動できますか?
与えられたコマンドは次のとおりですls -lR /etc/cron* > <filename>
。
私はその出力には影響しませんが、lsによって実行されたこれらのコマンドの出力を<filename>
私に送信される別のファイルにリダイレクトします。
私がやりたいことは、その内容を言及された2番目の結果に操作することです。デフォルトでは、最初の行をインポートしてファイルの2行目と3行目にパスを適用し、4行目をインポートして5行目に適用します。その後、これを一般的な方法で設定します。
awkを使うと効果があると思います。
ベストアンサー1
ファイル名またはディレクトリ名にスペースが含まれていない場合は、POSIX awkを使用して次のことを実行できます。
$ awk '
NF==1 && sub(/:$/,"/") { dir=$0; next }
match($0,/[^[:space:]]+$/) { $0=substr($0,1,RSTART-1) dir substr($0,RSTART) }
{ print }
' file
-rw-r--r-- 1 root root 128 May 15 2020 /etc/cron.d/0hourly
-rw------- 1 root root 235 Dec 17 2020 /etc/cron.d/sysstat
-rw------- 1 root root 235 Dec 17 2020 /etc/cron.daily/sysstat
または、ファイル/ディレクトリ名にスペースを含めることができますが、ディレクトリパスが常に次から始まり、出力に/
常にls
ファイル名の前にまったく同じ数のフィールドがある場合(例のように)、次のことができます。
$ awk '
/^\// && sub(/:$/,"/") { dir=$0; next }
match($0,/^([^[:space:]]+[[:space:]]+){8}/) { $0=substr($0,1,RLENGTH) dir substr($0,RLENGTH+1) }
{ print }
' file
ただしls
、これらのフィールドを使用して出力を生成することは必ずしも可能ではありません(ls
日付/時刻出力はファイルの寿命とロケールによって異なり、たとえばユーザーIDにスペースを含めることができます)、各ファイル行のすべての文字が表示されることがありますあります。ファイル名とディレクトリ名には:
YMMVを除く任意の文字を含めることができるため、ディレクトリ名はユーザーが思う/
ように終了できます。NUL
行を区別し、各ファイル行でファイル名を見つけます。さらに、ファイル名に改行文字を含めることができます。これはまったく別の問題です。
ls
したがって、生成できるすべての可能な出力を解析する信頼できる方法はありません。これを行うには、呼び出すコンテキストに関係なく十分だと思うか、必要なパターンマッチングが何であるかを把握し、それに基づいてスクリプトをls
作成します。
一部の他のツールはls
解析する必要がある出力ファイルを生成するため、解析を試みるべきではないことを私たち全員が知っているので、他のツールを修正する必要がありますls
(参照http://mywiki.wooledge.org/ParsingLsそしてなぜ`ls`を解析しないのですか*(そしてどうすればいいですか?))したがって、このツールは失敗します。