行から最後の文字を削除


54

行の最後の文字を削除したい:

[root@ozzesh ~]#df -h | awk  '{ print $5 }'
Use%
22%
1%
1%
59%
51%
63%
5%

期待される結果:

Use
22
1
1
59
51
63
5

2
常に%サインですか?
ベルンハルト

回答:


83
sed 's/.$//'

最後の文字を削除します。

しかし、この特定のケースでは、次のこともできます。

df -P | awk 'NR > 1 {print $5+0}'

算術式($5+0)を使用awkすると、5番目のフィールドを強制的に数値として解釈し、数値以降は無視されます。

GNU df-hここでは必要ありませんが、すでにGNU拡張機能です)には、ディスク使用率のみを出力するように指示することもできます。

df --output=pcent | tail -n +2 | tr -cd '0-9\n'

(tailはヘッダーをスキップし、trは数字と行区切り文字を除くすべてを削除します)。

Linuxでは、次も参照してください。

findmnt -no USE%

9
{print +$5}同様に動作します
...-jasonwryan

1
@jasonwryan、残念ながら、それがawk機能しない多くの実装があり、+単項演算子は無視され、文字列から数値への変換を強制しません。
ステファンシャゼル

20

sed、これはとても簡単です:

$ cat file
Use%
22%
1%
1%
59%
51%
63%
5%
$ sed 's/.$//' file
Use
22
1
1
59
51
63
5

構文はs(ubstitute)/search/replacestring/です。.任意の文字、と示して$ラインの終わりを。したがって.$、最後の文字のみが削除されます。

この場合、完全なコマンドは次のようになります。

df -h | awk '{ print $5}' | sed 's/.$//'

2
パイプsedは冗長です:で実行できますawkdf -h | awk '{gsub(/%/,""); print $5}'
jasonwryan

@jasonwryanステファンのソリューションの方が好きです。
ベルンハルト

15

私には2つの解決策があります:

  1. 切る: echo "somestring1" | rev | cut -c 2- | rev

    ここでは、文字列を逆にして、2番目の文字から文字列を切り取り、再び逆にします。

  2. sed: echo "somestring1" | sed 's/.$//'

    ここ.$では、最後の文字が続く文字を意味する正規表現を検索し、それをヌル//(2つのスラッシュの間)に置き換えます。



2

別のアプローチ:

mapfile -t list < <(df -h)
printf '%s\n' "${list[@]%?}"

関数に変換します:

remove_last() {
  local char=${1:-?}; shift
  mapfile -t list < <("$@")
  printf '%s\n' "${list[@]%$char}"
}

次に、次のように呼び出します。

remove_last '%' df -h

mapfile bash4の機能です。

ここでの問題は、削除する文字を指定する必要があることです。もし最後のキャラクターが何であれそれだけにしたいのなら、'?'またはを渡さなければなりません''。引用符が必要です。



1

これで試してください:

df -h | awk  '{ print $5 }' | sed "s/%//"

通常の使用は:(すなわち)

VALUE=987654321
echo X123456789X | sed "s/123456789/${VALUE}/"

応答は次のとおりです:X987654321X


1
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1

あなたはそれが動作し、おそらく、なぜこれが代替案よりも良いかもしれない方法についての説明のビットを提供することができれば、この答えはOPを越えて他の人にもっと役に立つことができ
フォックス

Unix Stackexchangeへようこそ!あなたはできるツアーに参加し、このサイトがどのように動作するかの感触を得るために。答えを出すとき、あなたの答えが読者が望むものである理由について何らかの説明をすることが望ましい。これは、それがどのように機能するかについて何らかの説明を与えるのが最善であることを意味します。上記を見ると、高く投票されたすべての回答がコードを説明していることがわかります。
スティーブンラウチ

cut -d '%' -f1最初の「%」までの行のすべてを取得するための正しい答えである使用に賛成です。
Titou

プラス私は唯一の有害な/間違った答えがこれまでに0を下回るdownvoted取得する必要があると考えている
Titou

0
sed -ie '$d' filename

here -i is to write changes
      e means expression
      $ means last line
      d means delete

Note:Without -e option $ wont work

オプション:1行目と最後の行を削除するには、sed -ie '1d;$d'filenameを使用します


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.