小编ego*_*ulz的帖子

在退出脚本之前等待后台进程完成

在退出脚本(TCL/Bash)之前,如何确保所有后台进程都已完成执行.

我正在考虑将所有后台进程pid写入pidfile.然后在最后pgrep pidfile,看看在退出之前是否有任何进程仍在运行.

有没有更简单的方法来做到这一点?有没有TCL特定的方法来做到这一点?

unix bash shell grep tcl

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

更改syslog中的日期格式

无论如何我们可以更改syslog记录的特定日志文件中的日期格式吗?我不想改变记录所有日志的方式,而只是改变日志文件.

编辑:我正在使用syslogd(在FreeBSD中)

这就是我的文件现在的样子:

Dec  5 07:52:10 Log data 1
Dec  5 07:52:10 Log data 2
Dec  5 07:52:10 Log data 3
Run Code Online (Sandbox Code Playgroud)

这就是我希望它看起来像:

20131205 07:52:10 Log data 1
20131205 07:52:10 Log data 2
20131205 07:52:10 Log data 3
Run Code Online (Sandbox Code Playgroud)

我的syslog.conf看起来像这样,其中/var/log/my_log.log是我的日志文件:

+@
*.notice;local0.none;local1.none;local2.none;authpriv.none;kern.debug;mail.crit;news.err        /var/log/messages
security.*                                      /var/log/security
auth.info;authpriv.info                         /var/log/auth.log
mail.info                                       /var/log/maillog
ftp.info                                        /var/log/xferlog
cron.*                                          /var/log/cron
*.=debug                                        /var/log/debug.log
console.info                                    /var/log/console.log

local1.info                                     /var/log/my_log.log
Run Code Online (Sandbox Code Playgroud)

linux freebsd date syslog

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

将进程的输出写入文件名中包含进程标识的文件

这就是我想要实现的目标:

  • 在后台运行命令/进程,并将其输出重定向到临时文件,该文件以后台进程的进程ID命名.
  • 例:
    • top&//进程此后台进程的ID为1123
    • top的输出应存储在文件1123.temp中

这可能吗?因为要在后台真正运行它,我们不必在将其标记为后台进程之前进行重定向吗?或者有一些技巧可以解决这个问题吗?

bash pid background-process io-redirection

6
推荐指数
1
解决办法
1513
查看次数

从TCL脚本和格式化输出在后台运行命令

我有一个tcl脚本,它连续运行多个shell命令.

像这样的东西:

abc.tcl

command 1
command 2 
command 3
...
command n
Run Code Online (Sandbox Code Playgroud)

此脚本按以下格式将这些命令的输出打印到文本文件中:

### ### ### ### ### ###
Command name
### ### ### ### ### ###

Command Output

### ### ### ### ### ##
Run Code Online (Sandbox Code Playgroud)

我试图让脚本运行得更快,但使shell命令并行运行而不是串行运行.通过将它们推到后台(命令a&).但我不知道如何保留输出文本文件的格式,就像以前一样.

当我将命令推入后台时,我被迫将其输出附加到临时文件中,但这些文件只是将转储中的命令输出放在一起.难以区分不同的输出.

在某种程度上,我可以将在后台运行的每个命令的输出重定向到单个临时文件(可能临时文件的名称可以具有后台运行进程的进程ID).一旦所有命令都运行,我可以将输出结合到正确的格式中吗?关于如何实现这一目标的任何想法/建议.

shell redirect background tcl

5
推荐指数
1
解决办法
3262
查看次数

如何用另一个文件中的映射值替换csv文件中的第n个字段?

我有一个csv文件,格式如下:

23:56:00,5,1,7,99,100,101
23:56:30,5,1,7,98,199,191
23:57:00,6,1,6,99,99,98
23:57:30,5,2,6,97,99,199
...
Run Code Online (Sandbox Code Playgroud)

以及以下格式的地图文件:

1:10
2:12
3:30
4:aa
5:16
6:11
7:bb
Run Code Online (Sandbox Code Playgroud)

我想要完成的是将第一个csv文件中第2,3和4列中的字段替换为它们在映射文件中映射到的值.

例如,在上面的例子中,我想要的最终输出是:

23:56:00,16,10,bb,99,100,101
23:56:30,16,10,bb,98,199,191
23:57:00,11,10,11,99,99,98
23:57:30,16,12,11,97,99,199
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?我试图找出一种使用awk/sed的方法,但我不知道如何访问awk中的多个文件,如果这是最好的方法.由于它是一个大文件,因此会有很多重复,因此我不认为每次检查映射是正确的方法.

有没有办法将地图存储到shell脚本内的哈希表中,然后使用哈希映射替换?

csv bash awk sed

2
推荐指数
1
解决办法
1913
查看次数

如何在tcl中将64位二进制字符串转换成十进制数字?

我正在尝试将64位二进制字符串值()转换为整数,但显然达到了tcl限制并得到:

integer value too large to represent
Run Code Online (Sandbox Code Playgroud)

二进制字符串:

000000000000101000000000000010100000000000000100
Run Code Online (Sandbox Code Playgroud)

我用来从二进制转换为整数的proc是:

  proc binary2decimal {bin} {
     binary scan [binary format B64 [format %064d $bin]] I dec
     return $dec
  }
Run Code Online (Sandbox Code Playgroud)

我尝试使用64进行格式化,也尝试使用LI无济于事。我读到有关“宽”字的信息,但不知道是否可以在这里应用。

PS:我正在使用tcl 8.4

binary 64-bit tcl decimal

2
推荐指数
1
解决办法
3679
查看次数

awk变量不适用于日期grep

 cat log | awk '/^Jun 14 11:52/,/^Jun 14 11:56/'
Run Code Online (Sandbox Code Playgroud)

这有效,它为我提供了这两个时间戳之间的日志行.

cat log | awk -v start="$startTime" -v end="$endTime" '/^start/,/^end/"

这不起作用.它返回空.

我使用awk变量的方式有问题吗?

unix bash shell awk

2
推荐指数
1
解决办法
111
查看次数

将临时文件连接到tcl中的单个文件

我正在尝试将文件夹中的所有临时文件连接到单个文本文件中.但我一直在遇到错误:

 if { [catch { exec cat /tmp/new_temp/* >> /tmp/full_temp.txt } msg] }
Run Code Online (Sandbox Code Playgroud)

错误信息:

-cat: /tmp/new_temp/*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如果我在tclsh上尝试相同的东西(没有catch和exec)它可以工作

file-io tcl concatenation

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

为什么我的tcl正则表达式与perl相比表现如此糟糕?

set fr [open "x.txt" r]
set fw [open "y.txt" w]
set myRegex {^([0-9]+) ([0-9:]+\.[0-9]+).* ABC\.([a-zA-Z]+)\[([0-9]+)\] DEF\(([a-zA-Z]+)\) HIJ\(([0-9]+)\) KLM\(([0-9\.]+)\) NOP\(([0-9]+)\) QRS\(([0-9]+)\)}
while { [gets $fr line] >= 0 } {
   if { [regexp $myRegex $line match x y w z]} {
       if { [expr $D >> 32] == [lindex $argv 0]} {
         puts $fw "$x"
       }
   }
}
close $fr $fw
Run Code Online (Sandbox Code Playgroud)

上面的tcl代码需要永远(32s或更多)才能执行.在perl中执行基本相同的操作在3秒或更短时间内运行.我知道perl对于一些正则表达式表现更好,但相比之下tcl性能真的会这么糟糕吗?差了10多倍?

我顺便使用TCL 8.4

以下是使用正则表达式运行上述代码的指标以及相同正则表达式的简化版本

32s is the time taken for the above code to execute
22s after removing: QRS\(([0-9]+)\) 
17s …
Run Code Online (Sandbox Code Playgroud)

regex perl performance tcl

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