首页 > 系统相关 >shell脚本技巧—创建和清空文件

shell脚本技巧—创建和清空文件

时间:2024-10-22 16:50:07浏览次数:6  
标签:文件 shell 技巧 mysql file 清空 txt LOG

写这篇文章的起因是因为在分析一个脚本时,看到这么一句脚本,如下所示

................................
>$RMAN_BACKUP/script/rman_backup.sql
................................

最开始我以为它就是将文件rman_backup.sql清空,这个类似于 cat /dev/null > $RMAN_BACKUP/script/rman_backup.sql命令。但是实际调试过程发现它的功能不局限于此。其实它的功能为:如果文件不存在时创建这么一个空文件,如果文件存在时清空该文件。猜测编写者就是想通过这么一句简单代码去实现这样的两个功能,他都懒得去写一段逻辑判断:"如果文件不存在就创建空的文件,如果文件存在就清空文件"。说这个脚本精妙吧,倒也谈不上。但是也确实够精简,代价就是阅读起来晦涩难懂。尤其对shell脚本不精通的人。只是shell编程中确实有一些奇淫技巧.这里不谈其优点与缺点,存在既是合理。

那么在shell中,有哪些创建文件的技巧呢?下面简单总结一下,方便以后编写shell脚本时使用,也方便你阅读shell代码。

方法1

touch命令可以用来创建一个空文件,如果文件已经存在,则会更新其时间戳。

案例

if [ ${MYSQL_SERVICE_EXISTS} -eq 1 ] && [ -f "$MYSQL_SERVICE_FILE" ]; then
    touch /usr/lib/systemd/system/mysqld.service
    chmod 644 /usr/lib/systemd/system/mysqld.service
    cat >/usr/lib/systemd/system/mysqld.service <<EOF
    ..................................
    ..................................
fi

方法2:

使用>重定向操作符将输出重定向到一个文件,如果这个文件不存在,就创建这个文件。

案例

................................
echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" > $LOG_FILE
................................

一般会用上面这种写法居多,使用最上面那种写法倒是比较少见。还有一些结合重定向符与其它命令实现的,如下所示

printf "it is test!\n" > filename.txt

方法3:

使用tee命令可以用来读取标准输入并将其写入到文件和标准输出。如果文件不存在,tee命令会创建它

案例

>$RMAN_BACKUP/script/rman_backup.sql
rman_backup |tee -a $RMAN_BACKUP/rman_backup.sql

方法4:

使用cat命令创建一个文件,如下所示,这里使用Here Document(<<EOF),它允许你输入多行文本,直到遇到EOF标记,

案例,创建一个mysqd.service的文件,并向其写入一段启动mysql服务的代码。

cat >/usr/lib/systemd/system/mysqld.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
 
[Install]
WantedBy=multi-user.target
 
[Service]
User=mysql
Group=mysql
 
# Have mysqld write its state to the systemd notify socket
Type=notify
 
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
 
# Start main service
ExecStart=/opt/mysql/mysql8.0/bin/mysqld --defaults-file=/data/mysql/conf/my.cnf $MYSQLD_OPTS
 
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
 
# Sets open_files_limit
LimitNOFILE = 100000
 
Restart=on-failure
 
RestartPreventExitStatus=1
 
# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
 
PrivateTmp=false
EOF

在shell脚本中,清空文件有哪些方法呢?一般来说有下面一些方法。

方法1

案例

> mysql_error.log

方法2

案例

echo ''  > mysql_error.log

这个方法比方法1更容易理解,读懂。

方法3

将/dev/null(一个空设备文件)的内容重定向到文件中,可以清空文件. 写法类似这样:cat /dev/null > filename

案例

if [ -f "${SLOW_LOG_PATH}/${NEW_SLOW_LOG_FILE}_${LOG_ROTATION_DATE}.log" ] ; then 
    echo "MySQL慢查询日志已经切换(rotation)"
else
    cat $SLOW_LOG_PATH/$SLOW_LOG_FILE > $SLOW_LOG_PATH/${NEW_SLOW_LOG_FILE}_${LOG_ROTATION_DATE}.log
    #最后运行的命令的结束代码(返回值)
    if [ $? -eq 0 ]; then
      cat /dev/null > $SLOW_LOG_PATH/$SLOW_LOG_FILE
    else
      echo "failed to empty file"
    fi
fi

方法4

truncate命令可以用来减少文件的大小,将其设置为0字节,从而清空文件。

truncate -s 0 mysql_error.log

方法5

: > filename.txt 这种方式来清空文件.

: > mysql_error.log

其中:表示什么也不做。前面命令中它会清空文件内容(截断文件);与rm不同,因为rm实际上会完全删除文件。 此外,如果文件不存在,则 :>filename.txt 实际上会创建该文件。更多关于这个命令的介绍如下所示,参考What is :>filename.txt Doing?[1]文中内容。

As you have discovered, this just empties the file contents (it truncates the file); that is different from rm as rm would actually remove the file altogether. Additionally, :>file.txt will actually create the file if it didn't already exist.

: is a "do nothing command" that will exit with success and produce no output, so it's simply a short method to empty a file. In most shells, you could simply do >file.txt to get the same result. It also could be marginally faster than other methods such as echo >file.txt as echo could potentially be an external command.

Additionally, echo >file.txt would put a blank line in file.txt where :>file.txt would make the file have no contents whatsoever.
参考资料
[1]

1: https://unix.stackexchange.com/questions/552436/what-is-filename-txt-doing

标签:文件,shell,技巧,mysql,file,清空,txt,LOG
From: https://www.cnblogs.com/kerrycode/p/18493261

相关文章

  • 语雀技巧:文档内部跳转
    在语雀文档中实现内部简单跳转,可以使用这个技巧第一步:选择文本,在更多中插入链接第二步:通过分享,打开自己文档的网页地址第三步:在网页中找到需要跳转到的标题,点击查看第四步:查看网址后面的#xxxxx(x为随机码),复制粘贴到刚刚的链接上粘贴到刚刚的链接上教程结束......
  • 【Linux】shell 脚本 (.sh) 编写及执行
    shell脚本shell脚本就是一些命令的集合#!/bin/bashecho"文件开头代表:该文件使用的是bash语法" 一、运行.sh文件方法一:当前文件执行.sh文件#文件必须含有x执行权限[文件赋x权限:chmodu+xhello.sh]./test.sh#文件可以没有x权限shtest.sh 方法二:绝对......
  • 那些被shell编程折磨的日子
    前言:我们为什么要学shell编程,因为shell编程占据了Linux的半壁江山,是运维人员必会的技能之一。Shell编程语言必知必会Shell命令解释器:bash目前应用最广泛一款命令解释器,红帽系列(默认),Debian,Ubuntu编程环境准备修改vimrc文件,达到控制vim创建,编辑文件的动作,当前用户......
  • 【SHELL】awk 命令用法
    linux命令行查询awk用法信息awk--helpUsage:awk[POSIXorGNUstyleoptions]-fprogfile[--]file...Usage:awk[POSIXorGNUstyleoptions][--]'program'file...POSIXoptions:GNUlongoptions:(standard)-fprogfile......
  • shell实例手册-文件操作
    一、文件常用操作   touchfile             #创建空白文件   rm-rf目录名          #不提示删除非空目录(-r:递归删除-f强制)   dos2unix               #windows文本转linux文本    unix2dos    ......
  • 前端发布shell脚本
    将“切换目录、npm构建、tar打包、scp传输到服务器、服务器端解压、服务器端文件解压替换、服务器端服务重启”流程,整合成一个shell脚本#!/bin/bash####@Description:前端自动发布脚本#@FilePath:publish.sh####获取脚本所在目录SCRIPT_DIR="$(cd"......
  • 【SHELL】sed 命令用法
    linux命令行查询grep用法信息sed--helpUsage:sed[OPTION]...{script-only-if-no-other-script}[input-file]...-n,--quiet,--silentsuppressautomaticprintingofpatternspace--debugannotateprogramexecution......
  • PowerShell的Runspace是一个用于执行PowerShell代码的环境。它提供了一个独立的上下文
    PowerShell的Runspace是一个用于执行PowerShell代码的环境。它提供了一个独立的上下文,允许你在其中运行命令、脚本和表达式。Runspace可以被认为是PowerShell会话的一个实例,可以在多线程环境中使用,允许你并发执行多个PowerShell任务。以下是关于PowerShellRunspace的一些关键点和......
  • Qt编程技巧小知识点(3)十进制与十六进制数据转化
    文章目录Qt编程技巧小知识点(3)十进制与十六进制数据转化小结Qt编程技巧小知识点(3)十进制与十六进制数据转化  上下位机之间数据交互常需要将上位机的十进制发送到下位机,这时候常常涉及到数据进制的转化,这里以十进制与十六进制的数据转化为例,来简要阐述一下:首先,我们......
  • 7个提升Google搜寻排名的SEO技巧(Google RankBrain)
    GoogleRankBrain是一种搜寻引擎演算法,GoogleRankBrain是基于人工智慧来自动判断搜寻者的搜寻意图,同时也将网页概念化,利用动态排序方式来对应搜寻关键字与搜寻结果,使其显示最佳的搜寻结果,我们在GoogleRankBrain权威指南当中非常详尽的解释GoogleRankBrain的运作原理,......