質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

870閲覧

シェルファイルの繰り返し処理で変数の大きさを比べていく方法を教えてください。

sukuzuku

総合スコア1

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2021/07/12 00:19

前提・実現したいこと

vsbox、centOS8でシェルファイルを作っています。
homeディレクトリ中の現在ps-ef+日付という5つのファイルについて一つずつ中身を参照し、行数をそれぞれ比べて変数に入れていき、行数が大きいファイルをtxtファイルに出力する、行数が一番多いファイルが二つあればファイルの古い順で比べて古いファイルを出力すする、という処理で悩んでいます。

発生している問題・エラーメッセージ

シェルスクリプトの中身
#!/bin/bash
LIST=ls -tr ps-ef*.txt | sort
ls $LIST| while read line
do
hensu=wc -l $line |awk '{print $1}'
hensu2=wc -l $line |awk '{print $2}'
echo $hensu
echo $hensu2
hensu_set=$hensu
if [[ $hensu -gt $hensu_set ]]; then
$hensu_set=$hensu
fi
done
echo $hensu_set
~
エラーメッセージ
[user@localhost ~]bash -x ps-ef_014.sh
++ sort
++ ls -tr ps-ef_20210708140611.txt ps-ef_20210708140612.txt ps-ef_20210708140615.txt ps-ef_20210709115333.txt ps-ef_20210709160730.txt

  • LIST='ps-ef_20210708140611.txt

ps-ef_20210708140612.txt
ps-ef_20210708140615.txt
ps-ef_20210709115333.txt
ps-ef_20210709160730.txt'

  • ls ps-ef_20210708140611.txt ps-ef_20210708140612.txt ps-ef_20210708140615.txt ps-ef_20210709115333.txt ps-ef_20210709160730.txt
  • read line

++ wc -l ps-ef_20210708140611.txt
++ awk '{print $1}'

  • hensu=104

++ wc -l ps-ef_20210708140611.txt
++ awk '{print $2}'

  • hensu2=ps-ef_20210708140611.txt
  • echo 104

104

  • echo ps-ef_20210708140611.txt

ps-ef_20210708140611.txt

  • hensu_set=104
  • [[ 104 -gt 104 ]]
  • read line

++ wc -l ps-ef_20210708140612.txt
++ awk '{print $1}'

  • hensu=102

++ awk '{print $2}'
++ wc -l ps-ef_20210708140612.txt

  • hensu2=ps-ef_20210708140612.txt
  • echo 102

102

  • echo ps-ef_20210708140612.txt

ps-ef_20210708140612.txt

  • hensu_set=102
  • [[ 102 -gt 102 ]]
  • read line

++ awk '{print $1}'
++ wc -l ps-ef_20210708140615.txt

  • hensu=101

++ awk '{print $2}'
++ wc -l ps-ef_20210708140615.txt

  • hensu2=ps-ef_20210708140615.txt
  • echo 101

101

  • echo ps-ef_20210708140615.txt

ps-ef_20210708140615.txt

  • hensu_set=101
  • [[ 101 -gt 101 ]]
  • read line

++ awk '{print $1}'
++ wc -l ps-ef_20210709115333.txt

  • hensu=101

++ awk '{print $2}'
++ wc -l ps-ef_20210709115333.txt

  • hensu2=ps-ef_20210709115333.txt
  • echo 101

101

  • echo ps-ef_20210709115333.txt

ps-ef_20210709115333.txt

  • hensu_set=101
  • [[ 101 -gt 101 ]]
  • read line

++ awk '{print $1}'
++ wc -l ps-ef_20210709160730.txt

  • hensu=100

++ awk '{print $2}'
++ wc -l ps-ef_20210709160730.txt

  • hensu2=ps-ef_20210709160730.txt
  • echo 100

100

  • echo ps-ef_20210709160730.txt

ps-ef_20210709160730.txt

  • hensu_set=100
  • [[ 100 -gt 100 ]]
  • read line
  • echo

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ls -tr ps-ef*.txt | sort

日付順にソートしていながら、それをまた名前順でソートし直すのが意味不明。

ls $LIST

さらにそれをlsに渡すのが意味不明。

hensu=wc -l $line |awk '{print $1}'

hensu2=wc -l $line |awk '{print $2}'

意味不明の変数名。
以下、意味不明の変数名で自分も混乱か?

ソートキーを付与してソートすれば良いかと思います。
なお、date -r ファイル名 +%F-%Tでファイルのタイムスタンプを得られます。

sh

1for f in ps-ef*.txt 2do echo `wc -l < $f` `date -r $f +%F-%T` $f 3done | 4sort -k 1,1n -k 2,2r | 5tail -n 1 | 6awk '{print $3}'

ファイルのタイムスタンプじゃなくて、ファイル名の中の日付を使うなら、

sh

1wc -l ps-ef*.txt | 2sed '$d' | 3sort -k 1,1n -k 2,2r | 4tail -n 1 | 5awk '{print $2}'

投稿2021/07/12 01:26

編集2021/07/12 01:29
otn

総合スコア84551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/07/12 01:59

あと、質問文のコードのように、パイプ処理の中で設定した変数は、パイプ終了後には参照できません。 例: X=xyz echo abc | while read a;do X=$a;echo in pipe $X;done echo out of pipe $X パイプ内の各処理はサブシェルで実行されるためです。
guest

0

wc -l で行数とファイル名が出力されるので、1カラム目と2カラム目でソートすればいいのでは?

例えば

$ wc -l ps* 10 ps-ef_20210708140611.txt 1 ps-ef_20210708140612.txt 10 ps-ef_20210708140615.txt 1 ps-ef_20210709115333.txt 10 ps-ef_20210709160730.txt 32 total

のとき

$ wc -l ps* | grep -v total | sort -k1,1 -k2,2r | tail -1 10 ps-ef_20210708140611.txt

投稿2021/07/12 01:05

sigsegv

総合スコア895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sukuzuku

2021/07/12 04:12

回答ありがとうございます。ソートしてから値を抜き出すのも楽ですね。もっと勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問