需要 Unix 基本 shell 脚本帮助吗?

需要 Unix 基本 shell 脚本帮助吗?

我需要一些帮助来编写一个可以在 AIX 上运行的基本 Unix shell 脚本:

循环将运行 netstat 命令 (netstat -an| grep 16752| grep ESTABLISHED| wc -l),该命令每秒计数会话数,并获取时间戳并将该数据重定向到日志以供审查。如果可能的话,我希望能够以分钟为单位输入它应该运行多长时间。我希望输出非常简单,看起来类似于:

timestamp  #count
timestamp  #count

答案1

这是一个提示。

date +%s

返回自纪元以来的秒数。由于一分钟有 60 秒,因此您可以轻松进行计算。ksh 和 bash 都允许您使用双括号括住表达式来进行算术运算,如下所示

echo $(( 324567 / 60 ))

答案2

我在 ksh 下测试了这一点,我相信这是 AIX 中使用的 shell。与我对这个问题的评论不同,似乎“until”工作正常。此脚本假设 bc 正在工作;我不确定语法是否$( )适用于您可能使用的旧 shell,但这是一种赌博,如果没有特定的 /shell 版本信息,它就必须这样做。

用法: thisscript.sh *minutes* 使用多个命令调用脚本分钟它将每秒运行一次命令,直到从计算出的 loop_total 倒计时到零。

除了几条“开始/结束”和持续时间消息外,没有可见的输出。所有内容都通过管道传输到 LOG_FILE。如果您希望输出到屏幕,则可能需要使用变量来存储数据,然后将其输出到 LOG_FILE。干杯。

#!/bin/sh
LOG_FILE="connections.txt"
PORT="16752"
COMMAND="netstat -an | grep ${PORT} | grep ESTABLISHED | wc -l"
TIMESTAMPER="date +'%D %H:%M:%S'" # Format like "mm/dd/yy hh:mm:ss"


if test -z "$1" ; then
  echo "ERROR: No duration provided"
  exit 1
else 
  INPUT="$1" # Store the number of minutes wanted
  LOOP_TOTAL=$(( ${INPUT} * 60 ))
  echo "Started on $( eval ${TIMESTAMPER} )"
  echo "Executing for: ${LOOP_TOTAL} seconds (${INPUT} minutes)" 
  COUNTDOWN=${LOOP_TOTAL} # Initialize counter

  until test ${COUNTDOWN} -eq 0 ; do
    COUNTDOWN=$(echo "${COUNTDOWN} - 1" | bc)
    OUTPUT=$( eval ${COMMAND} )
    if test -z "${OUTPUT}"; then
      OUTPUT="0" # greps are blank when no connection, so fill out as 0
    fi  

    TIMESTAMP=$( eval ${TIMESTAMPER} )  
    echo "${TIMESTAMP} #${OUTPUT}"
    sleep 1;
  done >> ${LOG_FILE}

  echo "Finished on $( eval ${TIMESTAMPER} ) "
fi

相关内容