标签: scripting

使用 rsync 输出中的“对话框”制作进度条

我正在寻找一种过滤/重定向 rsync 输出的方法,可以将其提供给“dialog --gauge”命令,以便在文件同步期间获得漂亮的进度条。目前我只在提示符下直接对其进行了测试,但我计划在 (bash) shell 脚本中执行此操作。

我环顾了互联网,发现了一些零碎的东西,但我仍然缺少一些东西来使它工作

(免责声明:这可能是一种完全错误的方法,并且是一种重定向/管道怪物)

我目前汇总的内容:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data | awk -f /home/user/rsync.awk | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
Run Code Online (Sandbox Code Playgroud)

首先,我有带有 --progress 选项的实际 rsync 命令 rsync 的输出通过管道传输到 awk 并使用以下 awk 过滤器:

{
   if (index($0, "to-check=") > 0)
   {
        split($0, pieces, "to-check=")
        split(pieces[2], term, ")");
        split(term[1], division, "/");
        print (1-(division[1]/division[2]))*100
}
#   else
#   {
#       print "#"$0;
#   }
   fflush();
}
Run Code Online (Sandbox Code Playgroud)

这会过滤掉 …

linux scripting bash awk rsync

16
推荐指数
1
解决办法
8924
查看次数

需要一个循环睡眠几分之一秒

在我的机器上,我需要执行一个循环来迭代 1 个简单命令,该命令必须具有以几分之一秒表示的延迟。

假设我需要:

  • 保存具有递增枚举( file-0, file-1, file-2, ... )的文件 time > file-$x
  • 我需要每 1/70 秒执行一次(例如),因为我想用几分之一秒来表达我的时间。

我如何才能真正精确并用 bash 脚本表达所有内容?

分数可以产生一个无法确定的数量,我需要精确,所以我至少需要 4-5 位小数。

scripting bash

16
推荐指数
3
解决办法
3万
查看次数

使用不同的参数重新运行相同的命令

我知道我可以运行以下命令

ls Some{File,Folder}
Run Code Online (Sandbox Code Playgroud)

它相当于运行这个:

ls SomeFile SomeFolder
Run Code Online (Sandbox Code Playgroud)

(我也经常用它来做类似的事情mv place_{a,b}

但是,我想知道是否有其他快捷方式可以执行以下操作:

run-command --a --whole --lot --of --flags parameter a; \
     run-command --a --whole --lot --of --flags parameter b
Run Code Online (Sandbox Code Playgroud)

我只需要打字run-command --a --whole --lot --of --flags parameter {a,b}或类似的东西。

command-line shell scripting

16
推荐指数
3
解决办法
1万
查看次数

删除超过 6 个月的文件的脚本

设置每月通过脚本运行的 cron 作业。

该脚本是每个月轮换一个文件,因为它变得太大并重命名旧文件。当文件超过六个月时,我希望将其删除。

希望每月运行一次此脚本。旧的可以删除吗?

如果这还不够清楚,请告诉我。

scripting ksh

16
推荐指数
1
解决办法
4万
查看次数

何时在 shell 脚本中使用重定向到 stderr

我知道像grep这样的行为良好的实用程序将“正常”消息输出到 stdout,将错误消息输出到 stderr。

$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当我自己编写 shell 脚本时,我经常发现很难决定我应该在 stderr 上显示什么输出和哪些消息,或者我是否应该打扰。

我想知道一些好的做法:什么时候将一些消息重定向到标准错误是合理的,什么时候不需要?

“这取决于”,当然,但是您是否有一些见解可以帮助我做出这些决定?

为了使这个主观问题符合格式,我想鼓励回答“为什么”,并以经验为基础,并在可能的情况下以事实为依据。

scripting bash io-redirection shell-script stderr

16
推荐指数
1
解决办法
1834
查看次数

将命令输出发送到变量时保留格式?

我有一个 bash 脚本。如果我运行此命令:

  1. 某些模式的 grep,
  2. 转换输出,
  3. 对输出进行排序
  4. 对输出进行重复数据删除

然后我在终端中每行找到一个 grep find

LC_ALL=C grep -o --color -h -E -C 0 -r "$pattern" /pathto/Pre_N/ | tr -d '[:digit:]' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

但是,如果我把它放在一个输出变量中,那么格式就会丢失(在回显到文件或在屏幕上回显时)。

#!/usr/bin/env bash
output=$(LC_ALL=C grep -o --color -h -E -C 0 -r "$pattern" /pathto/Pre_N/ | tr -d '[:digit:]' | sort | uniq)
echo $output > $fn
Run Code Online (Sandbox Code Playgroud)

将此命令保存到变量后,如何保留该命令的输出格式?

scripting bash

16
推荐指数
1
解决办法
3万
查看次数

使用 awk 计算匹配模式的记录

所以我被告知要last > lastloggedin创建一个文件,该文件显示自上次系统重新启动以来上次登录的类,现在我被要求编写一个 Awk 脚本,该脚本命名为myawk计数/确定lastloggedin包含字符串的行 数CFS264

我弄完了 grep -c CFS264 lastloggedin

scripting awk text-processing

16
推荐指数
2
解决办法
7万
查看次数

以编程方式更改密码

在当前版本的 Raspian 中,我知道可以从命令行更改当前登录用户的密码,如下所示:

sudo passwd
Run Code Online (Sandbox Code Playgroud)

然后会提示用户输入新密码两次。这将产生如下输出:

Changing password for pi.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可能以编程方式更改密码,例如从 shell 脚本更改密码。

我正在尝试制作一个配置脚本以部署在我的 Raspberry Pi 上,我不想手动为它们输入新密码。

linux scripting password raspbian

16
推荐指数
2
解决办法
2万
查看次数

如何在另一个函数内调用一个函数

我实际上正在使用 shell 脚本来监视服务器的资源。我有一个函数,我想知道:如何在主函数中调用第二个函数?

例子:

funct mainfunct(){

echo "Text to show here" **$secondfunct**

}

funct secondfunct(){
commands
}
Run Code Online (Sandbox Code Playgroud)

shell scripting

16
推荐指数
2
解决办法
4万
查看次数

将最后 n 行从一个文件复制到另一个文件

在同一台机器上多个用户帐户的 .bashrc 或 .vimrc 文件末尾添加相同行的上下文中,将最后 n 行从一个 shell 脚本复制到另一个的简单方法是什么?

scripting text-processing files

16
推荐指数
1
解决办法
4万
查看次数