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