相关疑难解决方法(0)

在文件中打印单行的最快方法

我必须从一个大文件(1500000行)中获取一个特定的行,在多个文件的循环中多次,我问自己什么是最好的选择(在性能方面).有很多方法可以做到这一点,我男子气概使用这些2

cat ${file} | head -1
Run Code Online (Sandbox Code Playgroud)

要么

cat ${file} | sed -n '1p'
Run Code Online (Sandbox Code Playgroud)

我找不到这个问题的答案,他们只获取第一行或两者之一(或两者)首先打开整个文件,然后获取第1行?

bash benchmarking sed head cat

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

有没有办法在终端列出git存储库?

我的系统上有几个git存储库,我想在终端列出所有这些存储库.

我正在寻找的是这样的:

/ path/to/my/git/repo/1/REPONAME1
/ path/to/my/git/repo/2/REPONAME2
/ path/to/my/git/repo/3/REPONAME3

如果你能想出如何显示分支名称和回购的状态,例如.[大师] c:0你:1 d:0,那会很棒.

git terminal

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

在Bash中组合变量以形成使用osascript命令发送到AppleScript的命令

我正在尝试使这个脚本工作.它是一个Bash脚本,用于获取一些变量,将它们放在一起并使用结果发送AppleScript命令.手动粘贴从to_osa后面的变量回显osascript -e到终端的字符串按我的意愿工作并期望它.但是当我尝试将命令osascript -e和字符串组合在一起时to_osa,它不起作用.我怎样才能做到这一点?

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\""
the_script='tell application "Safari" to set the URL of the front document to '
delimiter="'"
to_osa=${delimiter}${the_script}${the_url}${delimiter}
echo ${to_osa}
osascript -e ${to_osa}
Run Code Online (Sandbox Code Playgroud)

除了手动工作之外,当我将所需命令写入脚本然后执行它时,脚本也可以工作:

echo "osascript -e" $to_osa > ~/Desktop/outputfile.sh
sh  ~/Desktop/outputfile.sh
Run Code Online (Sandbox Code Playgroud)

macos bash applescript osascript

8
推荐指数
2
解决办法
4463
查看次数

对于有一行的文件,"$(cat file)","$(<file)"和"read ... <file"有什么区别?

我有一个只包含一行的输入文件:

$ cat input
foo bar
Run Code Online (Sandbox Code Playgroud)

我想在我的脚本中使用这一行,有三种方法可以让我知道:

line=$(cat input)
Run Code Online (Sandbox Code Playgroud)
line=$(<input)
Run Code Online (Sandbox Code Playgroud)
IFS= read -r line < input
Run Code Online (Sandbox Code Playgroud)

例如,使用命令替换意味着我会生成一个子shell,而read我不这样做,对吗?还有什么其他的差异,并且有一种方式优于其他方式?我也注意到(有strace)只是因为某种原因read触发了系统调用openat.其他人怎么可能不这样做?

$ strace ./script |& grep input
read(3, "#!/usr/bin/env bash\n\ncat > input"..., 80) = 80
read(255, "#!/usr/bin/env bash\n\ncat > input"..., 167) = 167
read(255, "\nline=$(cat input)\nline=$(<input"..., 167) = 60
read(255, "line=$(<input)\nIFS= read -r line"..., 167) = 41
read(255, "IFS= read -r line < input\n", 167) = 26
openat(AT_FDCWD, "input", O_RDONLY)     = 3
Run Code Online (Sandbox Code Playgroud)

bash file strace

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

尾随换行符和 bash 'read' 内置函数

在 bash 中,这是有效的:

echo -n $'a\nb\nc\n' | while read x; do echo = $x =; done
Run Code Online (Sandbox Code Playgroud)

while循环3次

= a =
= b =
= c =
Run Code Online (Sandbox Code Playgroud)

但想象一下一个没有传统尾随换行符的文本文件。我认为这read应该仍然适用于所有三行,但事实并非如此。我刚刚得到:

echo -n $'a\nb\nc' | while read x; do echo = $x =; done

= a =
= b =
Run Code Online (Sandbox Code Playgroud)

bash 中的内容help read并没有真正澄清。

注意:我不需要解决这个问题,我可以自己找到一些方法来修复它。我很好奇,并且很想提交错误报告 - 我通常会尝试尊重可能没有尾随新行的文件。我在使用 -d 选项读取时遇到了这一点。read -d " "将按空格而不是换行符进行分割,但它会错过最后一个条目,除非它有尾随空格。

(Ubuntu。GNU bash,版本 4.1.5(1)-发布)

bash shell newline built-in

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

与cat相比,Bash读取循环速度极慢,为什么?

一个简单的测试脚本:

while read LINE; do
        LINECOUNT=$(($LINECOUNT+1))
        if [[ $(($LINECOUNT % 1000)) -eq 0 ]]; then echo $LINECOUNT; fi
done
Run Code Online (Sandbox Code Playgroud)

当我这样做时cat my450klinefile.txt | myscript,CPU锁定为100%,并且每秒可以处理大约1000行.大约5分钟处理cat my450klinefile.txt >/dev/null半秒钟的事情.

有没有更有效的方法来实现这一点.我只需要从stdin读取一行,计算字节数,然后将其写入命名管道.但即便是这个例子的速度也很慢.

每1Gb的输入行我需要做一些更复杂的脚本操作(关闭并打开一些数据被输入的管道).

linux bash shell performance

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

如何使用linux命令获取非常大的csv文件的第二列?

我在接受采访时得到了这个问题.我说我可以用java或python之类的xreadlines()函数来遍历整个文件并获取列,但是面试官希望我只使用linux cmd.我怎样才能做到这一点?

linux csv command-line large-files

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

哪个是编写从文件读取的循环的最佳方法?

我正在学习bash并试图理解这两种从文件中读取行的方法之间的区别.

1.

while IFS= read -r line
do
  echo $line
done < "$file"
Run Code Online (Sandbox Code Playgroud)

2.

cat $file |
while read data
do
   echo $i
done
Run Code Online (Sandbox Code Playgroud)

所以基本上我想知道的是:它们中的任何一种比其他更常见吗?是否存在性能差异?等等

此外,还有其他方法从文件中读取甚至更好,特别是从大文件读取时?

bash

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

循环遍历 sed 的结果

我在循环访问 sed 返回的存储在变量中的行时遇到问题。

目前看起来有点像这样

lines=$(sed -rne '/'"$timestamplastupload"'/,/'"$timestampnow"'/ p' /var/log/test.log)

for line in "$lines"; do

        echo "This line is: $line"

done
Run Code Online (Sandbox Code Playgroud)

但到目前为止这不起作用,循环运行一次,而 $line 变量的内容似乎是整个 $lines 变量,因此只打印一次,而不是逐行循环,前缀为“This line is:”

我缺少什么能够逐段循环 sed 输出的每一行。(最终我会将匹配的行逐行上传到 API),因此我需要单独处理每一行,以便我可以根据需要处理它们。

根据要求,sed 的一些输出已被整理以确保安全

Wed Feb 28 22:33:11 2018 us=452112 xxx/1.2.3.4:55487 [xxx] Inactivity timeout (--ping-restart), restarting
Wed Feb 28 22:33:11 2018 us=452112 xxx/1.2.3.4:55487 [xxx] Inactivity timeout (--ping-restart), restarting
Wed Feb 28 22:33:11 2018 us=452112 xxx/1.2.3.4:55487 [xxx] Inactivity timeout (--ping-restart), restarting
Wed Feb 28 22:33:11 2018 us=452180 xxx/1.2.3.4:55487 SIGUSR1[soft,ping-restart] received, client-instance restarting …
Run Code Online (Sandbox Code Playgroud)

bash loops sed

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

您如何在 Xcode 10 脚本构建阶段使用文件列表 (.xcfilelist)?

从 Xcode 10 开始,构建脚本阶段可以使用文件列表 ( .xcfilelist) 进行输入和输出,而不是直接指定输入/输出文件。这些文件似乎支持注释(WWDC 示例在顶部显示了命令行注释)、空行(也在示例中),并且希望每行一个文件路径。如果这些文件包含构建设置(例如$(SRCROOT)),它们会在调用脚本之前展开,就像如果文件路径直接作为输入/输出文件被提供一样,它们会被展开。

这听起来是一个很棒的功能,但是您将如何在实际脚本中使用这些文件列表?

当直接指定文件时,你有 shell 变量SCRIPT_INPUT_FILE_COUNT,SCRIPT_OUTPUT_FILE_COUNT然后是每个输入/输出文件的一个变量,命名SCRIPT_INPUT_FILE_#和SCRIPT_OUTPUT_FILE_#位置#曾经是一个向上计数的数字。假设您有相同数量的输入/输出文件,此脚本将打印所有文件:

#!/bin/sh
: $((i=0))
while [ $i -lt "$SCRIPT_INPUT_FILE_COUNT" ]
do
    eval fileIn="\$SCRIPT_INPUT_FILE_${i}"
    eval fileOut="\$SCRIPT_OUTPUT_FILE_${i}"
    echo "$fileIn  -->  $fileOut"
    : $((i=i+1))
done
Run Code Online (Sandbox Code Playgroud)

这是一个干净的 POSIX 兼容 shell 脚本,是的,你可以在需要时让它更好,bash但上面的代码应该适用于每个sh兼容的 shell(它在使用#!/bin/sh和 not时也承诺#!/bin/bash)。

但是当使用文件列表时,它SCRIPT_INPUT_FILE_COUNT是 0。相反,你得到SCRIPT_INPUT_FILE_LIST_COUNTandSCRIPT_OUTPUT_FILE_LIST_COUNT和变量SCRIPT_INPUT_FILE_LIST_#and SCRIPT_OUTPUT_FILE_LIST_#,包含预处理文件列表的路径,其中所有注释和空行都已被删除,所有构建设置都已展开。

现在,我将如何在我的脚本中使用这些文件列表?上面的小示例脚本如何使用 Xcode 中的文件列表生成相同的输出?我不是很擅长 shell 脚本,我正在寻找一个干净的解决方案,它不需要任何其他脚本解释器,但sh.

shell xcode sh xcode10

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