PowerShell vs Bash Compared (PowerShell for Unixers)

, , …,

This pages shows the equivalent of PowerShell for common unix commands related to text processing, such as {grep, head, find, sort, uniq, wc, …}. The version of unix tool used here are Bash and GNU. (that's most linuxes, but not BSDs, Solaris, Mac OS X.)

For simpler things such as {cd, mkdir, ls, …}, see PowerShell as Bash.

PurposeBash + GNU utilsPowerShell
create new filetouch ffni ff -type file
ni = New-Item
show file contentcat ffcat ff
cat = Get-Content = gc
cat f1 f2 > new.txtcat f1, f2 > new.txt
show first n lineshead -n 50 ffcat ff | select -first 50
tailcat file | select -last 50
split?
PurposeBash + GNU utilsPowerShell
list dirsfind . -type dgci . -Recurse -name
gci = Get-ChildItem
find . -type f?
find . -name "*html"gci . -Recurse -name -include *html
find . -size 0ls . -recurse | where {$_.length -eq 0}
find . -type f -size 0 -exec rm {} \;?
PurposeBash + GNU utilsPowerShell
search textgrep xyz f.txtselect-string f.txt -pattern xyz -CaseSensitive
search textgrep xyz *htmlselect-string *html -pattern xyz -CaseSensitive
search textgrep -iselect-string without -CaseSensitive
search textgrep --invert-matchselect-string with -NotMatch
search textgrep --files-with-matches

cat ‹file name› | where { $_ -match "‹regex pattern›"}

cat ‹file name› | %{$_ -replace "‹regex pattern›","‹replace string›"}

PurposeBash + GNU utilsPowerShell
cmpdiff
diff = compare = Compare-Object
compare file differencediff f1 f2diff (cat f1) (cat f2)
sed?
print nth columnawk '{print $12 , $7}'?
sortsort (Sort-Object)
uniqsort -Unique
wcMeasure-Object
(measure = Measure-Object)
tr
basename
dirname

Work In Progress

Note: this page is a mess. It's work in progress. (started when i wished to convert my log processing bash script to PowerShell)

todo, shew PowerShell equivalent of this:

find . -print0 | xargs -0 -l -i echo "{}";
find . -name "*bmp" -print0 | xargs -0 -l -i basename -s ".bmp" "{}" | xargs -0 -l -i convert "{}.bmp" "{}.png". 

Detail

touch
# creating a new file in current dir
touch myfile.txt
# creating a new file in current dir
new-item -name myfile.txt -type "file"
Redirect “>”
# put content in a file
echo "some" > myfile.txt
echo "some more" >> myfile.txt # append
# put content in a file
"some" > myfile.txt
"some more" >> myfile.txt # append

Note that, by default, the PowerShell redirect operator ">" creates files with little endian utf-16 encoding, and lines are hard-wrapped at 80 chars, and line ending uses Windows convension of "\r\n" (ascii 13 and 10).

On unixes, the conventional file encoding is utf-8, and lines are not hard-wrapped (sometimes truncated (deleted) silently), and line ending uses "\n" (ascii 10).

To create unix style output, use out-file, like this:

"1'n2'n3" | out-file -Encoding utf8 -width 999000 myfile.txt

However, the line ending used is still "\r\n". To create unix line ending of just "\n", use:

… | Out-String | %{ $_.Replace("`r`n","`n") } | out-file

However, the end of the file will still contain a "\r".

cat

Unix “cat” can be used to read a file, or join several files. PowerShell equivalent is “get-content” with alias “cat” too.

# display a file content. (cat is alias of get-content)
cat myfile.txt

Note that by default, PowerShell assumes ascii. You can set your $OutputEncoding like this:

# set $OutputEncoding to utf-8
$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

Thanks to Shivashis Saha for addition on “cat”. He also sends the following:

split

For example, if you want to split a line based on ":", you can use the following line:

(given $str is a line with different fields separated by ":")
$temp=@($str -split ":"); 

Super thanks to Jeffrey Snover of Microsoft for helping on about 10 of the items. (Jeffrey's the inventor of PowerShell)

See also a short intro to PowerShell for unixers:

blog comments powered by Disqus