Articles of unix

unix shell脚本variables声明 – 找不到命令

nOption=' | awk '{total+=$1} END {print total/1024"kb"}' ' find . -type f -printf "%s %p/n"| sort -nr | head -n10 $nOption 我想创build一个脚本来查找当前目录中最大的文件。 这是我的脚本,如果我使用variablesreplace…. 输出:./big.sh:第67行:+ =:命令未find 但它的作品,如果我不使用variables: find . -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/1024"kb"}' 输出结果是我想要的:680.021kb 我的剧本怎么了? 谢谢

哪个shell应该用于Linux / MacOS / UNIX最佳兼容性?

我的问题可能与SO问题“ 我应该使用哪个Linux shell? ”有关,但是我的问题是要知道哪个shell将用于编写应用程序启动脚本,知道这是一个跨平台的Java应用程序(几乎所有的Linux发行版,MacOS,Solaris,…)。 所以我在这里添加兼容性问题 。 请注意, 我并不是问 “一般最好使用哪一个壳” (在我看来这可能没有意义:主观的,取决于需求),但是我想知道哪个壳有最好的机会今天,在大多数操作系统上都可用(并适用于Java应用程序的启动)。 另外,我可以简单地使用shebang #!/bin/bash来“使用bash”吗? (或者例如Korn shell的#!/bin/ksh )。 如果这个shell在这个操作系统上不可用呢? 我们实际上使用了一个“.sh”文件和shebang #!/bin/sh (我猜是Bourne shell),但是有些用户抱怨某些Linux发行版有错误(我们还不知道他们使用哪一个,但我们希望有一个更全球的方法,而不是一个接一个地修正错误)。 MacOS目前使用bash作为默认shell,但是目前我们在MacOS上没有使用/bin/sh 。 注意:我们希望避免有几个启动脚本(即使用不同的shell)

查看当前login的用户,并从/ etc / passwd获取他们的信息

我希望能够看到当前login到服务器的用户,然后根据他们的用户名search/etc/passwd文件,并find他们的ID(第3列)和全名(第5列)并将它们一起显示。 例如: $ who USER TTY billyt pts/2 $ cat /etc/passwd … billyt:x:10:100:Tom Billy:/home/billyt:/bin/bash … 我的输出应该显示他的用户名,ID和全名: Username: billyt ID: 10 FullName: Tom Billy 这是我到目前为止所尝试的: #!/bin/bash file="/etc/passwd" while IFS=: read -r f1 f2 f3 f4 f5 f6 f7 do # display fields using f1, f2,..,f7 echo "Username: $f1, UserID: $f3, FullName: $f5" done <"$file" 我试图显示我需要的领域(f1,f3和f5)。 这是一个好方法吗? […]

如何使R脚本从pipe道和用户给定的参数input

我有以下R脚本( myscript.r ) #!/usr/bin/env Rscript dat <- read.table(file('stdin'), sep=" ",header=FALSE) # do something with dat # later with user given "param_1" 用这个脚本,我们可以按照以下方式运行它: $ cat data_no_*.txt | ./myscript.r 我想要做的是让脚本从用户采取额外的参数: $ cat data_no_*.txt | ./myscript.r param_1 我该怎么做才能修改myscript.r以适应?

如何预先在Unix中通过find命令find文件的最后一行

我有一个要求,我需要显示格式下的目录下的所有文件的最后一行 filename: lastline 我find了下面的代码 find /user/directory/* -name "*txt" -mtime 0 -type f -exec awk '{s=$0};END{print FILENAME, ": ",s}' {} \; 但是我读这个每次读取整个文件。 我的目录中的文件是巨大的,所以我买不起这个。 我有其他的select吗? 更新:gniourf_gniourf的答案为我工作。 我在这里复制(谢谢大家的帮助!) 在其他答案中使用尾巴是好的。 现在,您可以将所有这些包装到find命令中。 如果你的find支持-printf命令: find /user/directory/ -name "*txt" -mtime 0 -type f -printf '%p: ' -exec tail -1 {} \; 如果您的查找不支持-printf命令: find /user/directory/ -name "*txt" -mtime 0 -type f -exec printf […]

在Perl中添加默认的系统换行符

当我将文本追加到文件中时,我想为文件添加正确的结束行:对于Unix: "\n"和Windows "\r\n" 。 但是,我找不到一个简单的方法来做到这一点。 这是我能想到的最好的: use strict; use warnings; use Devel::CheckOS (); my $fn = 'file'; open (my $fh, '<', $fn) or die "Could not open file '$fn': $!\n"; my $first_line = <$fh>; my $len = length $first_line; my $file_type = "undetermined"; if ($len == 1) { $file_type = "Unix" if $first_line eq "\n"; […]

如何根据AWK / UNIX中的公共字段将行中的分隔字段合并为一个字段

我仍然只是UNIX的新用户,尤其是AWK。 我有问题根据前2列值合并行。 我从一个文件的原始数据如下: Original data content ======================== ID1 ID2 Field1 Field2 1 1 11F1 11F2 1 2 12F1 12F2 2 1 21F1 21F2 2 2 22F1 22F2 ID1 ID2 Field3 Field4 1 1 11F3 11F4 1 2 12F3 12F4 2 1 21F3 21F4 2 2 22F3 22F4 ID1 ID2 Field5 Field6 1 1 11F5 11F6 […]

如何用C中的几个命令使用getopt打印输出

我有一个C文件,根据各种命令读取用户input和打印。 例如,如果我执行./cat -n文件名 然后在每一行打印数字 如果我执行./cat -e文件名 然后在每行上打印$ 到目前为止它的工作正常,但是当我一起执行这两个命令如./cat -n -e文件名,然后它打印一个文件两次,因为我已经在这两种情况下保持printf语句。 不过,我只想输出一次。 这是我的代码 #include<stdio.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { int flag = 0; char *cvalue = NULL; int index; int c; char buffer[256]; int linecount=1; opterr = 0; FILE *file ; while ((c = getopt (argc, argv, "net")) != -1) […]

合并保留unix中原始序列的多个文件

我在目录中有多个(超过100个)文本文件,例如 files_1_100.txt files_101_200.txt 该文件的内容是一些variables名称files_1_100.txt包含一些variables名称在1到100之间 "var.2" "var.5" "var.15" 同样, files_201_300.txt包含101到200之间的一些variables "var.203" "var.227" "var.285" 和files_1001_1100.txt一样 "var.1010" "var.1006" "var.1025" 我可以使用命令合并它们 cat files_*00.txt > ../all_files.txt 但是,文件的内容不在父文件中。 例如all_files.txt显示 "var.1010" "var.1006" "var.1025" "var.1" "var.5" "var.15" "var.203" "var.227" "var.285" 那么,如何确保files_1_100.txt内容是files_1_100.txt到来,其次是files_201_300.txt ,然后是files_201_300.txt ,这样files_1001_1100.txt的内容是 "var.1" "var.5" "var.15" "var.203" "var.227" "var.285" "var.1010" "var.1006" "var.1025"

转换awk数组下标的规则是什么?

我知道, awk数组的下标必须是一个string。 [root@localhost]# awk 'END {array[A0]="empty"; print array[""]}' empty 所以在上面的命令行中,因为A0不被引用为"A0" ,所以它代表一个variables。 因为variablesA0之前没有设置过,所以值是"" 。 所以print array[""]输出为empty 。 但是在下面的命令中: [root@localhost]# awk 'END {array[0]="empty"; print array[""], array["0"]}' empty array[""]值为NULL而array["0"]为"empty" 。 根据我的理解,这是因为variables不能以数字开头,默认情况下, array[0]被转换为array["0"] 。 这样对吗? 转换awk数组下标的规则是什么?