2016-09-05 15 views
0

Iは、以下の(Fedoraの24で実行されている)が示されました:awkの^(キャレット)除外はどのように機能しますか?

入力例:入力で実行

/sys/devices/system/memory/memory101/state:offline 
/sys/devices/system/memory/memory104/state:offline 
/sys/devices/system/memory/memory107/state:offline 

AWKコマンド:

ような出力を与える
grep offline data/onlineMemory | awk -F '[^0-9]+' {'print $2'} 

101 
104 
107 

しかし、awkのを印刷すると、私は何も見ない。ラインの他の部分はどこに行ったのですか?

なぜ$2が数字に設定されていますか?私はawkの^が文字を否定すると考えました。

+1

に適合していないので、それは良いでしょう文字列の特定の部分を数字とともに印刷したいと思うので、あなたの正確な期待される出力が何であるかを明確にするために[編集]してください。 – fedorqui

+1

キャラクターは*キャレットと呼ばれます*カラットはダイヤモンド重量と金の純度の単位です。 – tripleee

答えて

5

フィールドセパレータを[^0-9]+に設定しているので、awkは次のように理解しています。すべてが桁区切りです。

$ awk -F '[^0-9]+' '{for (i=1;i<=NF;i++) printf "line=%d. field num %d is --> %s\n", NR, i, $i}' file 
line=1. field num 1 is --> 
line=1. field num 2 is --> 101 
line=1. field num 3 is --> 
line=2. field num 1 is --> 
line=2. field num 2 is --> 104 
line=2. field num 3 is --> 
line=3. field num 1 is --> 
line=3. field num 2 is --> 107 
line=3. field num 3 is --> 

ですが、なぜでしょう:

#field1            field3 
#<|             |> 
# /sys/devices/system/memory/memory101/state:offline 
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ 
#    FS     ^^^  FS 
#         field2 

この方法では、あなたの文字列のほとんどすべては、フィールド区切りになり? awkはフィールドを設定するため、
FSまでのすべてに1番目を設定し、1番目のFSから2番目のFSまで2番目を設定します。これを要約することができます。この場合はそう

$ awk -F ';' '{for (i=1;i<=NF;i++) printf "line=%d. field num %d is --> %s\n", NR, i, $i}' <<< ";hello;" 
line=1. field num 1 is --> 
line=1. field num 2 is --> hello 
line=1. field num 3 is --> 

あなたはFSはかなり複雑なものになっている、:最後に、最後のフィールド($NF)は、レコードの最後まで、最後のFSからのすべてで構成されてい(したがって空)、だから何awk、この場合にはやっていることはFS anything but 3を使用して文字列abcde3fghiを分割することです

$ awk -F '[^3]+' '{for (i=1;i<=NF;i++) printf "line=%d. field num %d is --> %s\n", NR, i, $i}' <<< "abcde3fghi" 
line=1. field num 1 is --> 
line=1. field num 2 is --> 3 
line=1. field num 3 is --> 

最初のフィールドであることを最初のFSの前にすべてのものを作る:FSは3何でもありの例とtの後のすべて彼はFSの最後の出現を最後のフィールド(従って空でもある)とする。これにより、空ではない1つのフィールド、つまり2番目のフィールドが残されます。この行の

+1

すばらしい答えは、何が起こっているのか理解するのに役立ちます。私が望むのは、各行の番号です。これを達成するための簡単な方法はありますか? – Dan

+0

@Danはい、単に['NR'](https://www.gnu.org/software/gawk/manual/gawk)を印刷してください。html#Auto_002dset)(レコード数、この場合の行数)。たとえば、 '{print $ 2、NR}'と答えると、その行と行番号を表示できます。 – fedorqui

0

:NO数字がその中に存在しないため

/sys/devices/system/memory/memory101/state:offline 

フィールドセパレータは/sys/devices/system/memory/memoryあります。セパレーターの左側に

が何もません、あなたはすでに答え(実際には鉱山を)受け入れたものの、右に、あなたの数が、それは、セパレータの正規表現

関連する問題