在上一篇文章中,我们谈到了常用表达, 我们看到了如何在 sed 和 awk 中使用它们进行文本处理,我们之前讨论过Linux sed命令和awk 命令。在这个系列中,我们编写了一些小的 shell 脚本,但我们没有把事情搞混,我认为我们应该更进一步,编写一个有用的 shell 脚本。
然而,这篇文章中的脚本将帮助您增强脚本编写技能。
发送消息
我们将构建一个 bash 脚本,该脚本将向登录 Linux 系统的用户发送一条消息。
对于这个简单的 shell 脚本,我们只需要几个函数。我们将使用之前介绍过的一些基本命令;你可以回顾一下以前的帖子。
首先,我们需要了解登录的用户。您可以使用 who 命令来执行此操作,该命令会检索所有登录的用户。
$ who
要发送消息,您需要用户名和他当前的终端。
然后,您需要使用 mesg 命令了解用户是否允许消息。
$ mesg
如果结果显示“is y”,则表示用户允许消息。如果结果显示“is n”,则表示相反。
要检查任何记录的用户消息状态,请使用带有 -T 选项的 who 命令。
$ who -T
如果您看到破折号 (-),则表示用户关闭了消息,如果您看到加号 (+),则表示相反。
要允许消息,请键入带“y”选项的 mesg 命令,如下所示:
$ mesg y
果然,它显示“is y”,这意味着该用户允许发送消息。
当然,我们需要另一个用户能够与他通信,所以在我的例子中,我将使用另一台 PC 上的 SSH 连接到我的 PC,并且我已经与我的用户在系统上,所以我们有两个用户登录到系统。
我们来看看如何发送消息。
写命令
您可以使用 write 命令在使用用户名和当前终端的用户之间发送消息。
对于那些登录图形环境(KDE、Gnome、Cinnamon 或任何)的用户,他们无法接收消息。用户必须登录到终端。
我们将从我的用户 likegeeks 向 testuser 用户发送一条消息,如下所示:
$ write testuser pts/1
键入写入命令,然后键入用户和终端,然后按 Enter 键。
当您按 Enter 键时,您可以开始输入消息。消息发送完毕后,您可以通过按 Ctrl+D 组合键发送消息,这是文件结束信号。我建议您查看有关的帖子信号和工作.
接收方可以识别哪个用户在哪个终端上发送消息。 EOF表示消息结束。
我想现在我们已经具备了构建 shell 脚本的所有部分。
创建发送脚本
在创建 shell 脚本之前,我们需要确定要向其发送消息的用户当前是否在系统上,您可以使用 who 命令来确定这一点。
logged=$(who | awk -v IGNORECASE=1 -v usr=$1 '{ if ($1==usr) { print $1 }exit }')
我们使用 who 命令获取登录用户并将其通过管道传输到 awk 并检查它是否与输入的用户匹配。
最终输出为awk 命令存储在变量logging中。
然后我们需要检查变量是否包含某些内容:
if [ -z $logged ]; then
echo "$1 is not logged on."
echo "Exit"
exit
fi
我建议您阅读有关 if 语句及其使用方法的文章bash脚本.
我们测试了记录的变量以检查它是否为零。
如果为零,脚本将打印该消息,然后脚本终止。
如果用户已登录,则记录的变量包含用户名。
检查用户是否接受消息
您可以使用带有 -T 选项的 who 命令来检查用户是否允许消息。
check=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
if [ "$check" != "+" ]; then
echo "$1 disable messaging."
echo "Exit"
exit
fi
请注意,我们将 who 命令与 -T 一起使用。如果用户允许消息传递,则会在用户名旁边显示一个 (+)。否则,如果他将其关闭,则会在用户名旁边显示一个 (-)。
最后,我们检查消息指示符是否不等于加号 (+)。
检查消息是否包含在内
您可以检查发件人是否键入了消息,如下所示:
if [ -z $2 ]; then
echo "Message not found"
echo "Exit"
exit
fi
获取当前终端
在发送消息之前,我们需要获取当前用户终端并将其存储在变量中。
terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')
然后我们就可以发送消息了:
echo $2 | write $logged $terminal
现在我们可以测试整个 shell 脚本,看看它是如何运行的:
$ ./senderscript likegeeks welcome
让我们看看另一个 shell 窗口:
好的!您现在可以发送简单的单字消息。
发送长消息
如果您尝试发送多个单词:
$ ./senderscript likegeeks welcome to shell scripting
它不起作用。只有我们发送了消息的第一个字。
为了解决这个问题,我们将使用移位命令与 while 循环。
shift
while [ -n "$1" ]; do
message=$message' '$1
shift
done
现在,我们需要修复一件事,那就是消息参数。
echo $whole_message | write $logged $terminal
所以现在整个脚本应该是这样的:
#!/bin/bash
logged=$(who | awk -v IGNORECASE=1 -v usr=$1 '{ if ($1==usr) { print $1 }exit }')
if [ -z $logged ]; then
echo "$1 is not logged on."
echo "Exit"
exit
fi
check=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
if [ "$check" != "+" ]; then
echo "$1 disable messaging."
echo "Exit"
exit
fi
if [ -z $2 ]; then
echo "Message not found"
echo "Exit"
exit
fi
terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')
shift
while [ -n "$1" ]; do
message=$message' '$1
shift
done
echo $message | write $logged $terminal
如果你现在尝试:
$ ./senderscript likegeeks welcome to shell scripting
惊人的!!有效。再说一遍,我不是来制作一个脚本来向用户发送消息的,但主要目标是回顾我们的 shell 脚本知识并使用我们一起学习的所有部分并了解事物如何协同工作。
监控磁盘空间
让我们构建一个脚本来监视最大的前十个目录。
如果将 -s 选项添加到杜命令,它将显示汇总总数。
$ du -s /var/log/
我们使用 -S 选项来显示子目录总数。
$ du -S /var/log/
您应该使用 sort 命令对 du 命令生成的结果进行排序,以获得最大的目录,如下所示:
$ du -S /var/log/ | sort -rn
-n 按数字排序,-r 选项反转顺序,因此先显示较大的。
我们使用 N 命令用数字标记每一行:
sed '{11,$D; =}' |
sed 'N; s/\n/ /' |
然后我们可以使用 awk 命令清理输出:
awk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}'
然后我们添加一个冒号和一个制表符,这样看起来就好多了。
$ du -S /var/log/ |
sort -rn |
sed '{11,$D; =}' |
# pipe the first result for another one to clean it
sed 'N; s/\n/ /' |
# formated printing using printf
awk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}'
假设我们有一个名为 MY_DIRECTORIES 的变量,其中包含两个文件夹。
MY_DIRECTORIES=”/home /var/log”
我们将迭代 MY_DIRECTORIES 变量中的每个目录,并使用 du 命令获取磁盘使用情况。
所以 shell 脚本将如下所示:
#!/bin/bash
MY_DIRECTORIES="/home /var/log"
echo "Top Ten Directories"
for DIR in $MY_DIRECTORIES; do
echo "The $DIR Directory:"
du -S $DIR 2>/dev/empty |
sort -rn |
sed '{11,$D; =}' |
# pipe the first result for another one to clean it
sed 'N; s/\n/ /' |
# formated printing using printf
awk '{printf $1 "\t" "\t" $2 "\t" $3 "\r\n"}'
done
exit
好的!!目录 /home 和 /var/log 都在同一个报告中。
您可以过滤文件,因此您可以计算特定扩展名(如 *.log 或其他)的消耗,而不是计算所有文件的消耗。
我在这里必须提到的一件事是,在生产系统中,您不能依赖磁盘空间报告;相反,您应该使用磁盘配额。
Quota 包适合这种情况,但在这里我们正在学习 bash 脚本的工作原理。
我们在这里介绍的 shell 脚本再次是为了向您展示 shell 脚本的工作原理。在 Linux 中实现任何任务的方法有很多种。
我尝试减少帖子长度并使一切尽可能简单,希望您喜欢。
继续回来。谢谢。