Linux 学习笔记之(十)文件操作

一、目的

   在linux服务器上,常常会需要查看linux文件/脚本或者是服务的log日志等等,此时就需要有技巧或方式达到各种查看目的。  以及 可以操作文件的各种方式。

二、查看方式

      这里以查看 tomcat 的 catalina 日志文件为例。

1、cat

1) 选项

选项 说明 备注
-n 显示所有行,并给所有行标注行号,包括空格  
-b 显示所有,仅给非空格的行标注行号  
-A 显示所有行,TAB 显示为字符 ^I,行换显示为字符 $  
-e 相当于 -vE,即:显示所有行,每行结尾显示 $  
-E 显示所有行,每行结尾处显示 $  
-s 显示所有行,当时若连续出现超过2个空行,则显示一个空行  
-t 相当于 -vT,即:显示所有行,Tab 则显示为字符  ^I  
-T 将 Tab 显示成 ^I  
-v ??  

2) 示例

  •   查看文件的时候显示所有行,并显示行号 (包括空行) (cat -n catalina.2021-09-02.log

  • 查看文件的时候显示行(不包括空行) (cat -b catalina.2021-09-02.log

  • 显示文件内容,显示^I标记(Tab键),显示$标记(换行符) (cat -A catalina.2021-09-02.log)

 

  • 显示所有行,每行结尾处加 $,表示换行 (cat -E catalina.2021-09-02.log)

  •  连续超过2个空行,则显示一个空行   (cat -s catalina.2021-09-02.log

  •  显示所有行,Tab 显示成 ^I (cat -T catalina.2021-09-02.log

2、more

1) 选项

选项 说明 备注
-d 当一屏显示不下文件内容的时候,在屏幕下方提示按键操作:Press space to continue,'q' to quit  
-f  计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)  
-l  取消遇见特殊字元 ^L(送纸字元)时会暂停的功能  
-p  不以卷动的方式显示每一页,而是先清除萤幕后再显示内容  
-c  跟 -p 相似,不同的是先显示内容再清除其他旧资料  
-u  不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)  
-s  当遇到有连续两行以上的空白行,就代换为一行的空白行  
-NUM 指定一个屏幕仅显示的行数(行数:屏幕的行数,非文件中实际的行数),在屏幕下方提示:MORE(1%),按空格再显示指定屏幕行数的内容  
+NUM  从第 num 行开始显示  
+/SPRING 在+/后面可以输入匹配的字符串,如果指定文件中不存在,则提示,否则直接显示对应字符串第一次匹配上所在的行。文件内容过多一个屏幕显示不了,在屏幕下方会提示:MORE(1%),按空格再显示指定屏幕行数的内容  

2) 示例

  • 当一屏显示不下文件内容的时候,在屏幕下方提示按键操作:Press space to continue,'q' to quit     (more -d catalina.2021-09-02.log

  • 指定一个屏幕仅显示的行数(more -5 catalina.2021-09-02.log

     每次仅显示屏幕的5行内容,下方出现 “MORE”,则可以按空格键,继续显示5行屏幕内容,按 “ctrl + c” ,表示退出

  •  文件中指定搜索的字符串,从第一次匹配的行开始显示 (more +/'startup in' catalina.2021-09-02.log

      从指定字符串第一次匹配的那行开始显示,一个屏幕显示不了内容,则下方出现 “MORE”,则可以按空格键,继续显示5行屏幕内容,按 “ctrl + c” ,表示退出

3、tail

1) 选项

选项 说明 备注
-f 文件中不停追加内容时在控制台也不断输出  
-n

+num:表示从第num行到文件结尾的内容全部显示

[-]num:表示从文件的倒数第num行到文件结尾的内容全部显示

 
-c

+num:表示从文件的正数第num个字符开始显示到文件结尾

[-]num:表示从文件的倒数第num个字符开始显示到文件结尾

 
-v 显示文件内容同时,在开头显示文件名称  

2) 示例

  • 文件中追加内容也不断追加显示在控制台上  (tail -f catalina.2021-09-02.log)

  •  显示从文件的倒数第10行开始展示 (tail -n 10 catalina.2021-09-02.log)

  •  显示从文件的第500行开始展示(tail -n +1750 catalina.2021-09-02.log)

  •  从文件的倒数第 10 个字符开始显示到结尾(tail -c 10 catalina.2021-09-02.log)

  •  显示文件内容之前显示文件名称(tail -v -c 10 localhost.2021-09-03.log)

 4、head

1) 选项

选项 说明 备注
-c

k:表示显示文件的前 k 个字符;

-k:显示所有内容除了最后 k 个字符;

 
-n

k:表示显示文件的前 k 行;

-k:显示所有内容除了最后 k 行;

 

2)示例

  • 显示文件的前10行(head -n 10 localhost.2021-09-03.log )  ,head 不指定任何选项时,也是输出文件的前 10 行内容

  • 显示文件的全部内容,除了最后10行(head -n -10 localhost.2021-09-03.log)

      

三、文件信息查看

1、stat 查看文件信息

   stat 文件  ,可以查看到的信息包含: 文件大小、权限、所属组、所属用户、最近访问时间、最近更改时间、最近改动时间

   

示例

1) 获取文件最近修改时间

FILE='test.log'
last_time=$(stat -c %Y $FILE)
formart_date=$(date '+%Y-%m-%d/%H:%M:%S' -d @$last_time)
echo $formart_date

2、basename 获取文件或者目录的名称

basename $file|$dir

 

示例

test.sh 备放置到了/opt/disaster/bin目录下

test.sh内容

#!/bin/bash
 

cur_dir=$(cd "$(dirname "$0")"; pwd)
echo $cur_dir
echo `basename $cur_dir`

file_path=$cur_dir/test.sh
echo `basename $file_path`

 

 

四、其它示例

1、日志文件压缩(每10个文件进行压缩)

 

CUR_DIR=$(cd `dirname $0`; pwd)

log_archive(){
  log_file=$1
  log_file_size=$(du -s ${log_file}  |awk '{print  $1}')
  if [ ${log_file_size} -gt 10000 ];then
    mv -f ${log_file} ${log_file}_`date +%F%T`.txt
    touch ${log_file}
  fi
  pa_dir=`dirname $log_file`
  cd $pa_dir
  ## 日志文件数量超过10个则进行压缩
  file_array=(`ls -xtr --file-type *.txt`)
  if [ $? -ne 0 ] || [ -z $file_array ];then
    return
  fi

  if [ ${#file_array[@]} -gt 10 ];then
    tarFile=`date '+%Y%m%d%H%M%S'`.tar
    for file in ${file_array[*]};do
	    if [ ! -f $tarFile ];then
		  tar -cf $tarFile $file
		else
		  tar -rf $tarFile $file
		fi
	    
		if [ $? -eq 0 ];then
		  rm -f $file
		fi
    done
	tar -czf `date '+%Y%m%d%H%M%S'`.tar.gz $tarFile
	if [ $? -eq 0 ];then
	  rm -f $tarFile
	fi
  fi
}

log_file=$CUR_DIR/health_check.`date '+%Y%m%d'`.log
touch $log_file
log_archive $log_file

while true
do
  echo $(date "+%Y-%m-%d %H:%M:%S") hello >> $log_file
  cat test.sh >>$log_file
  echo "" >> $log_file
  log_archive $log_file
done
exit 0

  

2、日志文件压缩(仅保留10个最新日志文件,其它全部压缩)

#!/bin/bash
CUR_DIR=$(cd `dirname $0`; pwd)

log_archive(){
  log_file=$1
  log_file_size=$(du -s ${log_file}  |awk '{print  $1}')
  if [ ${log_file_size} -gt 10000 ];then
    mv -f ${log_file} ${log_file}_`date +%F%T`.txt
    touch ${log_file}
  fi
  pa_dir=`dirname $log_file`
  cd $pa_dir
  ## 日志文件数量超过10个则进行压缩
  file_array=(`ls -xtr --file-type *.txt`)
  if [ $? -ne 0 ] || [ -z $file_array ];then
    return
  fi
  archive_count=$(( ${#file_array[@]}-10))
  index=1
  if [ ${#file_array[@]} -gt 10 ];then
    echo $archive_count
    tarFile=`date '+%Y%m%d%H%M%S'`.tar
    for file in ${file_array[*]};do
      if [ $index -le $archive_count ];then
        if [ ! -f $tarFile ];then
          tar -cf $tarFile $file
        else
          tar -rf $tarFile $file
        fi
        
        if [ $? -eq 0 ];then
          rm -f $file
        fi
      fi
      let index++
    done
  fi
}

log_file=$CUR_DIR/health_check.`date '+%Y%m%d'`.log
touch $log_file
log_archive $log_file

while true
do
  echo $(date "+%Y-%m-%d %H:%M:%S") hello >> $log_file
  cat test.sh >>$log_file
  echo "" >> $log_file
  log_archive $log_file
done
exit 0

 

posted @ 2021-09-05 09:44  夏之夜  阅读(396)  评论(0编辑  收藏  举报