Welcome!

Blog Feed Post

Unix To PowerShell - Wc

PowerShell_unix PowerShell is definitely gaining momentum in the windows scripting world but I still hear folks wanting to rely on unix based tools to get their job done.  In this series of posts I’m going to look at converting some of the more popular Unix based tools to PowerShell.

wc

The Unix “wc” (word count) command will print the character, word, and newline counts for each file specified and a total line if more than one file is specified.  This command is useful for quickly scanning a directory for small and large files or to quickly look at a file and determine it’s relative size.  The Get-Content Cmdlet will return the number of characters in the full but not the number of lines and words.  The following script will emulate the behavior of the Unix “wc” command with a few changes in the way parameters are supplied.

   1: #----------------------------------------------------------------
   2: # Wc.ps1
   3: #----------------------------------------------------------------
   4: param
   5: (
   6:   [string]$filespec = $null,
   7:   [bool]$lines = $false,
   8:   [bool]$words = $false,
   9:   [bool]$chars = $false,
  10:   [bool]$longest = $false
  11: );
  12:  
  13: #----------------------------------------------------------------
  14: # function New-Stat
  15: #----------------------------------------------------------------
  16: function New-Stat()
  17: {
  18:   param([string]$name);
  19:   $stat = "" | select Lines, Words, Chars, Longest, Name;
  20:   $stat.Lines = $stat.Words = $stat.Chars = $stat.Longest = 0;
  21:   $stat.Name = $name;
  22:   $stat;
  23: }
  24:  
  25: #----------------------------------------------------------------
  26: # function Get-ColumnList
  27: #----------------------------------------------------------------
  28: function Get-ColumnList
  29: {
  30:   param
  31:   (
  32:     [bool]$lines = $false,
  33:     [bool]$words = $false,
  34:     [bool]$chars = $false,
  35:     [bool]$longest = $false
  36:   );
  37:   $cols = $null;
  38:   if ( $lines ) { $cols += @("Lines"); }
  39:   if ( $words ) { $cols += @("Words"); }
  40:   if ( $chars ) { $cols += @("Chars"); }
  41:   if ( $longest ) { $cols += @("Longest"); }
  42:   $cols += @("Name");
  43:   
  44:   $cols;
  45: }
  46:  
  47: #----------------------------------------------------------------
  48: # function Do-Wc
  49: #----------------------------------------------------------------
  50: function Do-Wc()
  51: {
  52:   param
  53:   (
  54:     [string]$filespec = $null,
  55:     [bool]$lines = $false,
  56:     [bool]$words = $false,
  57:     [bool]$chars = $false,
  58:     [bool]$longest = $false
  59:   );
  60:   
  61:   # if no options are given, set them all to true
  62:   if ( !$lines -and !$words -and !$chars -and !$longest )
  63:   {
  64:     $lines = $words = $chars = $longest = $true;
  65:   }
  66:   
  67:   $stats = $null;
  68:   
  69:   $stat_total = New-Stat -name "total";
  70:   
  71:   [System.IO.FileInfo[]]$files = Get-ChildItem $filespec -ErrorAction SilentlyContinue;
  72:   if ( $null -ne $files )
  73:   {
  74:     foreach ($file in $files)
  75:     {
  76:       # new stat object for current file
  77:       $stat = New-Stat -name $file.Name;
  78:       
  79:       [string[]]$content = Get-Content $file;
  80:       
  81:       # wc only prints newlines so the last line is omitted
  82:       $stat.Lines = $content.Length -1;
  83:       
  84:       # iterate through the lines in the file
  85:       for ($i=0; $i -lt $content.Length; $i++)
  86:       {
  87:         $info = $content[$i] | Measure-Object -word -line -char
  88:         $stat.Words += $info.Words;
  89:         $stat.Chars += $info.Characters;
  90:         if ( $info.Characters -gt $stat.Longest ) { $stat.Longest = $info.Characters }
  91:         
  92:         # increment the count for newline characters (except for last line)
  93:         if ( $i -lt ($content.Length-1) ) { $stat.Chars += 2; }
  94:       }
  95:       
  96:       $stat_total.Chars += $stat.Chars;
  97:       $stat_total.Lines += $stat.Lines;
  98:       $stat_total.Words += $stat.Words;
  99:       
 100:       $stats += @($stat);
 101:     }
 102:     $stats += @($stat_total);
 103:  
 104:     $stats | select (Get-ColumnList -lines $lines -words $words -chars $chars -longest $longest) | ft -AutoSize;
 105:   }
 106:   else
 107:   {
 108:     "No files matching pattern '$filespec' found!";
 109:   }
 110: }
 111:  
 112: Do-Wc -filespec $filespec -lines $lines -words $words -chars $chars -longest $longest;

*Update – Thanks to twitter user @Jaykus for the tips on the Measure-Object cmdlet.  Although it didn’t offer a complete replacement, it did make the script faster than the character iteration for each line.

*Update 2 – Added support for longest line count as well.

Read the original blog entry...

More Stories By Joe Pruitt

Joe Pruitt is a Principal Strategic Architect at F5 Networks working with Network and Software Architects to allow them to build network intelligence into their applications.

Latest Stories
Internet of @ThingsExpo, taking place October 31 - November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with the 21st International Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry players in the world. @ThingsExpo Silicon Valley Call for Papers is now open.
This talk centers around how to automate best practices in a multi-/hybrid-cloud world based on our work with customers like GE, Discovery Communications and Fannie Mae. Today’s enterprises are reaping the benefits of cloud computing, but also discovering many risks and challenges. In the age of DevOps and the decentralization of IT, it’s easy to over-provision resources, forget that instances are running, or unintentionally expose vulnerabilities.
SYS-CON Events announced today that Twistlock, the leading provider of cloud container security solutions, will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Twistlock is the industry's first enterprise security suite for container security. Twistlock's technology addresses risks on the host and within the application of the container, enabling enterprises to consistently enforce security policies, monitor...
SYS-CON Events announced today that Ocean9will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Ocean9 provides cloud services for Backup, Disaster Recovery (DRaaS) and instant Innovation, and redefines enterprise infrastructure with its cloud native subscription offerings for mission critical SAP workloads.
Five years ago development was seen as a dead-end career, now it’s anything but – with an explosion in mobile and IoT initiatives increasing the demand for skilled engineers. But apart from having a ready supply of great coders, what constitutes true ‘DevOps Royalty’? It’ll be the ability to craft resilient architectures, supportability, security everywhere across the software lifecycle. In his keynote at @DevOpsSummit at 20th Cloud Expo, Jeffrey Scheaffer, GM and SVP, Continuous Delivery Busine...
While some vendors scramble to create and sell you a fancy solution for monitoring your spanking new Amazon Lambdas, hear how you can do it on the cheap using just built-in Java APIs yourself. By exploiting a little-known fact that Lambdas aren’t exactly single threaded, you can effectively identify hot spots in your serverless code. In his session at 20th Cloud Expo, David Martin, Principal Product Owner at CA Technologies, will give a live demonstration and code walkthrough, showing how to ov...
SYS-CON Events announced today that Enzu will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY, and the 21st International Cloud Expo®, which will take place October 31-November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Enzu’s mission is to be the leading provider of enterprise cloud solutions worldwide. Enzu enables online businesses to use its IT infrastructure to their competitive ad...
Everywhere we turn in our industry we can find strong opinions about the direction, type and nature of cloud’s impact on computing and business. Another word that is used in every context in our industry is “hybrid.” In his session at 20th Cloud Expo, Alvaro Gonzalez, Director of Technical, Partner and Field Marketing at Peak 10, will use a combination of a few conceptual props and some research recently commissioned by Peak 10 to offer a real-world consideration of how the various categories of...
DevOps is often described as a combination of technology and culture. Without both, DevOps isn't complete. However, applying the culture to outdated technology is a recipe for disaster; as response times grow and connections between teams are delayed by technology, the culture will die. A Nutanix Enterprise Cloud has many benefits that provide the needed base for a true DevOps paradigm. In his Day 3 Keynote at 20th Cloud Expo, Chris Brown, a Solutions Marketing Manager at Nutanix, will explore t...
SYS-CON Events announced today that SoftLayer, an IBM Company, has been named “Gold Sponsor” of SYS-CON's 18th Cloud Expo, which will take place on June 7-9, 2016, at the Javits Center in New York, New York. SoftLayer, an IBM Company, provides cloud infrastructure as a service from a growing number of data centers and network points of presence around the world. SoftLayer’s customers range from Web startups to global enterprises.
SYS-CON Events announced today that Interoute has been named “Bronze Sponsor” of SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Interoute is the owner operator of Europe's largest network and a global cloud services platform, which encompasses over 70,000 km of lit fiber, 15 data centers, 17 virtual data centers and 33 colocation centers, with connections to 195 additional partner data centers. Our full-service Unifie...
SYS-CON Events announced today that CollabNet, a global leader in enterprise software development, release automation and DevOps solutions, will be a Bronze Sponsor of SYS-CON's 20th International Cloud Expo®, taking place from June 6-8, 2017, at the Javits Center in New York City, NY. CollabNet offers a broad range of solutions with the mission of helping modern organizations deliver quality software at speed. The company’s latest innovation, the DevOps Lifecycle Manager (DLM), supports Value S...
SYS-CON Events announced today that Peak 10, Inc., a national IT infrastructure and cloud services provider, will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Peak 10 provides reliable, tailored data center and network services, cloud and managed services. Its solutions are designed to scale and adapt to customers’ changing business needs, enabling them to lower costs, improve performance and focus intern...
Multiple data types are pouring into IoT deployments. Data is coming in small packages as well as enormous files and data streams of many sizes. Widespread use of mobile devices adds to the total. In this power panel at @ThingsExpo, moderated by Conference Chair Roger Strukhoff, panelists will look at the tools and environments that are being put to use in IoT deployments, as well as the team skills a modern enterprise IT shop needs to keep things running, get a handle on all this data, and deli...
SYS-CON Events announced today that Linux Academy, the foremost online Linux and cloud training platform and community, will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Linux Academy was founded on the belief that providing high-quality, in-depth training should be available at an affordable price. Industry leaders in quality training, provided services, and student certification passes, its goal is to c...