对文件执行操作的 Shell 脚本
大多数时候,我们使用 shell 脚本与文件交互。 Shell 脚本提供了一些运算符和一些命令来检查和执行与文件相关的不同属性和功能。
为方便起见,我们创建了一个名为“geeks.txt”的文件和另一个 .sh 文件(或简单地在命令行上运行)以对该文件执行不同的功能或操作。操作可能是读取文件内容或测试文件类型。这些将在下面通过适当的例子进行讨论:
文件读取功能
文件读取是程序员生活中一项有趣的任务。 Shell 脚本提供了一些用于读取文件、反转内容、计算单词、行等的功能。
- 逐行读取:首先,我们使用 read 命令获取输入,然后运行 while 循环,该循环逐行运行。
脚本:
#!/bin/bash
read -p "Enter file name : " filename
while read line
do
echo $line
done < $filename
- 计算文件中的字符、单词和行数:我们取三个变量,一个分别用于计算字符、单词和行数。我们使用“wc”命令,它代表字数,也计算字符和单词的数量。为了计算行数,我们传递 'grep ',它保持匹配模式的行数。然后我们打印出每个变量。
脚本:
#! /bin/bash
echo Enter the filename
read file
c=`cat $file | wc -c`
w=`cat $file | wc -w`
l=`grep -c "." $file`
echo Number of characters in $file is $c
echo Number of words in $file is $w
echo Number of lines in $file is $l
- 反向显示文件内容:要反向打印任何文件的内容,我们使用 tac 或 nl、sort、cut 命令。 Tac 只是 cat 的反面,只是以相反的顺序打印文件。而 nl 命令编号,文件内容以相反的顺序对编号的文件进行排序,而 cut 命令删除编号并打印文件内容。
脚本:
$ nl geeks.txt | sort -nr | cut -f 2-
- 文件中特定单词的频率:为了计算文件中每个单词的频率,我们使用某些命令。这些是 xargs 将打印应用于输出中的每一行,排序的排序,通过管道传输到它的当前缓冲区,uniq -c 显示缓冲区中每行的计数,最后 awk,打印第二列,然后是第一列基于问题需求。
脚本:
cat geeks.txt | xargs printf “%s\n” | sort | uniq -c | sort -nr | awk ‘{print $2,$1}’
文件测试操作符
- -b file:此运算符检查文件是否为块特殊文件,随后返回真或假。它在语法上是 [-b $file]。
脚本:
#! /bin/bash
echo -e "Enter the name of the file : \c"
read file_name
if [ -b $file_name ]
then
echo "$file_name is a block special file"
else
echo "$file_name is not a block special file"
fi
输出:
- -d 文件:运算符查看文件是否作为目录存在。如果是,则返回 true 否则返回 false。它在语法上是 [-d $file]。
脚本:
#! /bin/bash
echo -e "Enter the name of the file : \c"
read file_name
if [ -d $file_name ]
then
echo "$file_name is a directory"
else
echo "$file_name is not a diirectory"
fi
输出:
- -e file:运算符检查文件是否存在。即使传递了目录,如果目录存在,它也会返回 true。它在语法上是 [-e $file]。
脚本:
#! /bin/bash
echo -e "Enter the name of the file : \c"
read file_name
if [ -e $file_name ]
then
echo "$file_name exist"
else
echo "$file_name not exist"
fi
输出:
- -f 文件:如果文件是普通文件或特殊文件,则返回真,否则返回假。它在语法上是 [-f $file]。
脚本:
#! /bin/bash
echo -e "Enter the name of the file : \c"
read file_name
if [ -f $file_name ]
then
echo "$file_name is file"
else
echo "$file_name is not file"
fi
输出:
- -r 文件:检查文件是否可读。如果发现是,则返回 true 否则返回 false。它在语法上是 [-r $file]。
脚本:
#! /bin/bash
echo -e "Enter the name of the file : \c"
read file_name
if [ -r $file_name ]
then
echo "$file_name is readable"
else
echo "$file_name is not readable"
fi
输出:
- -s file:此运算符检查文件的大小是否大于零,随后返回 true 或 false。它在语法上是 [-s $file]。
脚本:
#! /bin/bash
echo -e "Enter the name of the file : \c"
read file_name
if [ -s $file_name ]
then
echo "$file_name has size>0"
else
echo "$file_name has size= 0"
fi
输出:
- -w 文件:如果允许对文件进行压缩,则运算符返回 true,否则返回 false。它在语法上是 [-w $file]。
脚本:
#! /bin/bash
echo -e "Enter the name of the file : \c"
read file_name
if [ -w $file_name ]
then
echo "$file_name is writeable"
else
echo "$file_name is not writable"
fi
输出:
- -x 文件:运算符查看文件是否可执行,并随后返回 true 和 false。它在语法上是 [-x $file]。
脚本:
#! /bin/bash
echo -e "Enter the name of the file : \c"
read file_name
if [ -x $file_name ]
then
echo "$file_name is executable"
else
echo "$file_name is not executable"
fi
输出:
重命名和删除文件:要重命名文件,我们使用“mv”命令更改文件名和“rm”命令删除文件。
正如我们在命令行下方看到的那样,破坏坏文件(重命名后)并使用 'rm' 命令删除它,它不再存在。