sedを使用して変数から複数の正規表現を削除する

sedを使用して変数から複数の正規表現を削除する

私はこれが簡単だと確信していますが、良い例が見つからないようです。ボックスの初期化システムを見つけるために/ proc / 1 / exeを解析しようとしています。 Exeはinitシステムへのシンボリックリンクですが、ファイル数を数えてみるとその中に引用符がありますが、それを削除したいと思います。残念ながら、exeには通常のアポストロフィ(U + 0027)と左右の単一引用符(U + 2018とU + 2019)が表示されます。システムによって異なります。これは、私が実行しているシェルおよび/またはそのバージョンが原因であるのか、統計ユーティリティが原因であるのか、システム自体が原因であるのかは不明です。今、これら3つの文字がすべて混ざっているのを見ました(時々一緒に混在しています)。

最終的に同じsedコマンドを使用してこれらの文字をすべて削除したいと思います。これまでは、sedを他のsedコマンドに接続しなければ、これを行うことができませんでした。

完全なexeファイルは次のとおりです。

$stat /proc/1/exe

  File: '/proc/1/exe' -> '/sbin/init'
  Size: 0           Blocks: 0          IO Block: 1024   symbolic link
Device: b9h/185d    Inode: 76948360    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-02-01 14:52:39.101744022 -0700
Modify: 2017-01-25 12:52:20.741244423 -0700
Change: 2017-01-25 12:52:20.741244423 -0700
 Birth: -

この例では一般的なアポストロフィに過ぎませんが、他の引用符も見たことがあります。だからまず必要なものを手に入れます。

$stat /proc/1/exe | grep File: | awk -F '->' '{print $2}'
'/sbin/init'

今、引用符を削除したいと思います。さまざまな種類の引用符をすべて削除する唯一の方法は、複数のsedコマンドを使用することです。

$stat /proc/1/exe | grep File: | awk -F '->' '{print $2}' | sed 's/\xe2\x80\x98//g' | sed 's/\xe2\x80\x99//g' | sed 's/\x27//g'
 /sbin/init

次に、別のawkステートメントにパイプします。

$stat /proc/1/exe | grep File: | awk -F '->' '{print $2}' | sed s'/\xe2\x80\x98//g' | sed 's/\xe2\x80\x99//g' | sed 's/\x27//g' | awk -F '/' '{print $NF}'
init

私は/proc/1/commを知っているか、/proc/1/exeでlsを使用しています。問題は、3つのsedコマンドを1つにまとめる方法です。それが必要です:

開く、閉じる、またはアポストロフィがある場合は削除します。すべての状況でこれを行う必要があります。

しかし、ボックスの初期化システムを取得するためのより良いコマンド(信頼できない/ proc / 1 / commを除く)を知っている人がいる場合、またはこれらのコマンドをより効率的にすることができる人がいる場合は、プロセスで学ぶことに興味があります。

ベストアンサー1

他の人が指摘したように、PID 1の属性を決定するより良い方法があります。単一のパイプラインで複数の呼び出しを使用することはほとんど良い考えではgrepありません。そうでない場合はを使用してください。 (簡単)できない場合は、以下を使用してください。sedawkgrepsedsedawk

stat /proc/1/exe | sed -n '/File:/{s/.*-> *[\xe2\x80\x98]//;s/[\xe2\x80\x99].*//p;q}'

おすすめ記事