ls -lで最後のk列だけを表示する方法は?

ls -lで最後のk列だけを表示する方法は?

ls -l最初の4つの列を削除して、コマンドに表示される列を制限したいと思います。

ls -lh示す:

drwxr-sr-x 20 gamma alpha 4.0K May 22 13:18 Desktop
drwxr-sr-x  3 gamma alpha   22 Oct  6  2014 Eclipse
-rw-r--r--  1 gamma alpha  28K Jul 11  2014 fire
drwxr-sr-x  5 gamma alpha   48 Mar 31  2014 lb_deployment

最初の4列を削除するためにls -lh | cut -d " " -f5-。ただし、期待どおりに動作しません。

4.0K May 22 13:18 Desktop
alpha  22 Oct  6  2014 Eclipse
alpha 28K Jul 11  2014 fire
alpha  48 Mar 31  2014 lb_deployment

私は次のような外観が大好きです。

4.0K May 22 13:18 Desktop
  22 Oct  6  2014 Eclipse
 28K Jul 11  2014 fire
  48 Mar 31  2014 lb_deployment

期待どおりに動作しないのは、 で区切り文字を空白cut( -d " ") として定義したのですが、最初のファイル ( の 2 番目の列) へのリンク数が\ls -lh2 桁の数字 (20) なので、もうls -lh1 つ追加したからです。 1ビットリンクカウンタを使用すると、ファイル内のリンクカウンタにスペースを追加して列の位置を調整できます。これはcut予期しない動作を引き起こします。

この問題を解決する方法についてのアイデアはありますか?

答え1

ユーザーとグループの列を省略するには、-oオプションを渡します。-gユーザー名とグループ名にはスペースを含めることができるため、確実に編集することはできません。

権限とリンク数の列を省略するオプションはありません。保持したい最初の列は空白(右揃えの場合)で始まる可能性があるため、空白を空白ではなく変換として開始基準として使用することはできません。代わりに、最後の列の右端を使用して不要な列を削除してください。最初の2つの列にはスペースを含めることができないので安全です。

ls -lhog | sed 's/^[^ ][^ ]*  *[^ ][^ ]* //'

sed コマンドの説明:

  • s/REGEXP/REPLACEMENT/各行で、指定された正規表現の最初の項目を指定された代替テキストに置き換えます。ここの代替テキストは空です。
  • ^行の先頭にのみ一致するように正規表現の先頭に追加します。
  • [^ ][^ ]*空白を除いて空でない文字シーケンスと一致します。
  • したがって、sedコマンドは、空白ではなく、最初と2番目のシーケンスと次のスペースを削除します(ただし、最後には1つのスペースしかありません)。

答え2

これは私にとって効果的です。

ls -lhn | sed -r 's#^\S+(\s+\S+){3}##'

ユーザー名とグループ名を数値IDに変換する追加の-nフラグです。lsその結果、削除する既知の数のフィールドを取得します。

-rwxr-xr-x  1 1001 1001 1.4K Mar 23 18:07 something.sh

各列間のスペースは可変ですが、列をソートするために使用されるため、ls盲目的に削除することはできません。私は主要な権限ブロックを削除し、3つのグループを削除することにしました。空のテキストと空でないテキスト、それぞれリンク数、uid、gid と一致します。これにより、ソートが機能し続けるように、gidとファイルサイズを区切るスペースが残ります。正規表現はsedこのパターン削除を実装します。#...#...#区切り文字の提供(マッチそして変える)、この-rフラグを使用すると、拡張正規表現を使用できます。構造的に^行の先頭に一致があります。\S+1 つ以上の空白以外の文字の一致が、\s+1 つ以上の空白文字の一致があります。角かっこは(...)2つの項目を一緒にグループ化し、中かっこはグループが{3}次のようになることを示します。 3回繰り返す。

 4.0K Jun  6  2014 template
 4.0K May 21 17:35 stuff
    0 Mar 16 09:46 Items
 1.4K Mar 23 18:07 something.sh
  24K May 19 14:45 curtain

答え3

合唱団に参加した後、それを使用して不要awkな熱を消去することもできます。

[jis@localhost ~]$ ls -lh | awk '{$1=$2=$3=$4="";print}'

    4.0K Aug 19 2014 Desktop
    4.0K Jan 8 22:39 dir1
    4.0K Feb 5 20:41 Documents
    12K May 22 19:31 Downloads
    4.0K Aug 19 2014 Music
    4.0K May 3 20:00 Pictures
    4.0K Aug 19 2014 Public
    115K May 9 09:05 something.bin
    4.0K Aug 19 2014 Templates
    1 Dec 12 07:01 testLink -> .
    4.0K Aug 19 2014 Videos
[jis@localhost ~]$ 

答え4

grepを使ったきれいなソリューション:

ls -lhn | grep -oP "^([[:graph:]]+\s){4}\K.+"

ここでは、

[[:graph:]] ==> all printed characters (i.e. no spaces, newlines)
\s          ==> space
{4}         ==> exactly four matches

関連情報