假设您有一个包含IP地址的文件,每行包含一个地址:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Run Code Online (Sandbox Code Playgroud)
您需要一个shell脚本,它为每个IP地址计算它在文件中出现的次数.对于先前的输入,您需要以下输出:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Run Code Online (Sandbox Code Playgroud)
一种方法是:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Run Code Online (Sandbox Code Playgroud)
然而,它真的远没有效率.
如何使用bash更有效地解决这个问题?
(有一点要补充:我知道它可以通过perl或awk解决,我对bash中的更好解决方案感兴趣,而不是那些语言.)
附加信息:
假设源文件为5GB,运行算法的机器为4GB.因此,排序不是一种有效的解决方案,也不是多次读取文件.
我喜欢类似哈希表的解决方案 - 任何人都可以对该解决方案进行改进吗?
附加信息#2:
有些人问为什么我会在bash中使用它时更加困难,例如perl.原因是在机器上我必须这样做perl不适合我.这是一个定制的linux机器,没有我习惯的大多数工具.我认为这是一个有趣的问题.
所以,请不要责怪这个问题,如果你不喜欢它就忽略它.:-)
我有一个python脚本,它将检查队列并对每个项目执行操作:
# checkqueue.py
while True:
check_queue()
do_something()
Run Code Online (Sandbox Code Playgroud)
如何编写一个bash脚本来检查它是否正在运行,如果没有,则启动它.大概下面的伪代码(或者它应该做类似的事情ps | grep?):
# keepalivescript.sh
if processidfile exists:
if processid is running:
exit, all ok
run checkqueue.py
write processid to processidfile
Run Code Online (Sandbox Code Playgroud)
我将从crontab中调用它:
# crontab
*/5 * * * * /path/to/keepalivescript.sh
Run Code Online (Sandbox Code Playgroud) 给定绝对或相对路径(在类Unix系统中),我想在解析任何中间符号链接后确定目标的完整路径.奖励积分也可以同时解析〜用户名表示法.
如果目标是目录,则可以将chdir()放入目录然后调用getcwd(),但我真的想从shell脚本而不是编写C帮助程序.不幸的是,shell倾向于试图隐藏用户的符号链接(这是OS X上的bash):
$ ls -ld foo bar
drwxr-xr-x 2 greg greg 68 Aug 11 22:36 bar
lrwxr-xr-x 1 greg greg 3 Aug 11 22:36 foo -> bar
$ cd foo
$ pwd
/Users/greg/tmp/foo
$
Run Code Online (Sandbox Code Playgroud)
我想要的是一个函数resolve(),这样当从上例中的tmp目录执行时,解析("foo")=="/ Users/greg/tmp/bar".
我需要为Mac应用程序创建一个不错的安装程序.我希望它是一个磁盘映像(DMG),具有预定义的大小,布局和背景图像.
我需要在脚本中以编程方式执行此操作,以集成到现有构建系统中(实际上更多是打包系统,因为它只创建安装程序.构建是单独完成的).
我已经使用"hdiutil"完成了DMG创建,我还没有发现如何制作图标布局并指定背景位图.
我正在做一些bash脚本,现在我有一个变量调用source和一个数组调用samples,如下所示:
source='country'
samples=(US Canada Mexico...)
Run Code Online (Sandbox Code Playgroud)
因为我想扩展源的数量(并且每个源都有自己的样本)我试图添加一些参数来做到这一点.我试过这个:
source=""
samples=("")
if [ $1="country" ]; then
source="country"
samples="US Canada Mexico..."
else
echo "try again"
fi
Run Code Online (Sandbox Code Playgroud)
但是当我运行我的脚本时source countries.sh country它没有用.我究竟做错了什么?
我可以通过以下方案表达我的需求:编写一个接受字符串的函数作为本机命令运行.
这并不是一个想法:如果你正在与公司其他地方的其他命令行实用程序连接,那么它将为你提供逐字运行的命令.因为您不控制命令,所以您需要接受任何有效的命令作为输入.这些是我无法轻易克服的主要问题:
该命令可能执行生活在其中包含空格的路径中的程序:
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';
Run Code Online (Sandbox Code Playgroud)该命令可能包含带空格的参数:
$command = 'echo "hello world!"';
Run Code Online (Sandbox Code Playgroud)该命令可能包含单蜱和双蜱:
$command = "echo `"it`'s`"";
Run Code Online (Sandbox Code Playgroud)有没有干净的方法来完成这个?我只能设计出奢华和丑陋的变通方法,但对于脚本语言,我觉得这应该是简单的.
我正在尝试编写一个简单的bash脚本,它将包含隐藏文件和文件夹的文件夹的全部内容复制到另一个文件夹中,但我想排除某些特定的文件夹.我怎么能实现这个目标?
我有一个C++/Obj-C背景,我只是发现了Python(已经写了大约一个小时).我正在编写一个脚本,以递归方式读取文件夹结构中的文本文件的内容.
我遇到的问题是我编写的代码只适用于一个文件夹.我可以在代码中看到原因(参见参考资料#hardcoded path),我只是不知道如何继续使用Python,因为我的经验只是全新的.
Python代码:
import os
import sys
rootdir = sys.argv[1]
for root, subFolders, files in os.walk(rootdir):
for folder in subFolders:
outfileName = rootdir + "/" + folder + "/py-outfile.txt" # hardcoded path
folderOut = open( outfileName, 'w' )
print "outfileName is " + outfileName
for file in files:
filePath = rootdir + '/' + file
f = open( filePath, 'r' )
toWrite = f.read()
print "Writing '" + toWrite + "' to" + filePath
folderOut.write( toWrite ) …Run Code Online (Sandbox Code Playgroud) 我的脚本收到的一个参数是以下格式的日期:yyyymmdd.
我想检查一下是否有一个有效的日期作为输入.
我怎样才能做到这一点?我试图使用正则表达式:[0-9]\{\8}