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

浙公网安备 33010602011771号