Today I needed the seq Unix utility and I discovered that MacOS X does not have it. Neither does MacPorts :-(. So I Googled for it and found that scripting god Dave Taylor (who lives in Boulder) has a blog post about this. He provides a shell script that produces basic seq functionality and it works great. Now I'm able to write quick little one-liners like this:
for i in $(seq 1 10); do cp ~/tmp/cheese.xml ~/tmp/cheese$i.xml; done
Thanks, Dave!
17 October 2008
Subscribe to:
Post Comments (Atom)
Hi Bruce. Actually on BSD style Mac OS systems, the seq command is actually known as "jot". For example, with seq you would do:
ReplyDeletefor i in `seq 20 40`; do ping 192.168.1.${i}; done
Where on BSD OS' you do:
for i in `jot 21 20`; do ping 192.168.1.${i}; done
Same thing, differeent name. ;-)
Thanks, Jeff! I have never heard of jot.
ReplyDeleteUm - got bash?
ReplyDeletefor i in {1..9}; do echo $i; done
That was the first thing I tried and now I see I should have used the braces instead of parens :-/. Thanks!
ReplyDelete@dc2447, that doesn't seem to work when using variables:
ReplyDelete$ upper=10
$ for i in {1..$upper}; do echo $i; done
{1..10}
$ for i in {1..${upper}}; do echo $i; done
{1..10}
Thus my Google search led me to this post and now I know about jot -- thanks Jeff!
If you need to make this cross platform neither jot nor seq will work and bash will be best to use. If you throw in an eval I can get this to work with a variable.
ReplyDelete$ for i in `eval echo {1..$upper}`; do echo $i; done
jot is a great native alternative, and the {1..12} range thing is nice, but if you are way too lazy, or unwilling to hack up old scripts that assume seq or some other gnu utility will be there, you could do:
ReplyDelete1. install coreutils
2. make a temp file or somehow generate a list of the coreutils installed files, and use the list to create symbolic links in your path without the g prefix. I used port -d install coreutils, and just copied a bit of the debug output, but I'm sure there is a better way
3. profit?
[566][csuttles.killface: /Users/csuttles/Work/tmp]$ cat /tmp/list.txt
DEBUG: Adding file to file_map: /opt/local/bin/gbase64 for: coreutils
DEBUG: Adding file to file_map: /opt/local/bin/gbasename for: coreutils
DEBUG: Adding file to file_map: /opt/local/bin/gcat for: coreutils
DEBUG: Adding file to file_map: /opt/local/bin/gchcon for: coreutils
...
create the links:
for i in `awk '{print $6}' /tmp/list.txt ` ; do echo $i ; ln -s $i `echo $i | sed -e 's/bin\/g/bin\//'`; done
check your links:
for i in `awk '{print $6}' /tmp/list.txt ` ; do echo $i ; ls -l $i ; ls -l `echo $i | sed -e 's/bin\/g/bin\//'`; done
killface:~ root# for i in `awk '{print $6}' /tmp/list.txt ` ; do echo $i ; ls -l $i ; ls -l `echo $i | sed -e 's/bin\/g/bin\//'`; done
/opt/local/bin/gbase64
-rwxr-xr-x 2 root admin 62112 Jan 26 22:44 /opt/local/bin/gbase64*
lrwxr-xr-x 1 root admin 22 Jan 26 22:49 /opt/local/bin/base64@ -> /opt/local/bin/gbase64
/opt/local/bin/gbasename
-rwxr-xr-x 2 root admin 57544 Jan 26 22:44 /opt/local/bin/gbasename*
lrwxr-xr-x 1 root admin 24 Jan 26 22:49 /opt/local/bin/basename@ -> /opt/local/bin/gbasename
/opt/local/bin/gcat
-rwxr-xr-x 2 root admin 80024 Jan 26 22:44 /opt/local/bin/gcat*
lrwxr-xr-x 1 root admin 19 Jan 26 22:49 /opt/local/bin/cat@ -> /opt/local/bin/gcat
...
their is an easy way :
ReplyDeletesudo port install coreutils
and in your .profile add the line :
alias seq='gseq'
voilĂ .
BTW: aliases only work in the interactive shell. If you want to use seq in scripts, you'd need to e.g. symbolically link:
Deleteln `which gseq` ~/bin/seq
(assuming ~/bin is in your $PATH)
you can also try:
ReplyDeletesudo brew install coreutils
and alias seq='gseq'
This is a lifesaver. I've been using seq forever and this was really starting to bug me!
ReplyDelete