In this tutorial we will cover different examples using sed
and awk
commands from shell into golang programming language. We have already covered exec.Command
and context package usage and examples in our previous articles to run shell commands How to execute shell commands in Golang?
So we will re-use these modules in this tutorial to also execute awk
and sed
commands.
Using sed in golang
Example-1: Perform a simple search and replace
Here is a simple example to perform search and replace operation in golang using sed
:
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("sed", "-i", "s/oldstring/newstring/g", "file.txt")
out, err := cmd.Output()
if err != nil {
panic(err)
}
fmt.Println(string(out))
}
Example-2: Using sed to delete a range of lines from a file
Let's perform another operation to delete a range of lines from a file:
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("sed", "-i", "2,5d", "file.txt")
out, err := cmd.Output()
if err != nil {
panic(err)
}
fmt.Println(string(out))
}
Example-3: Use sed to delete all lines containing specific string
Here is another example to perform in file sed
operation by searching for all lines with specific string and then deleting those lines.
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("sed", "-i", "/string/d", "file.txt")
out, err := cmd.Output()
if err != nil {
panic(err)
}
fmt.Println(string(out))
}
Example-4: Use sed to replace string with regex pattern match
Let's use a complex sed operation perform regex match. Here we use sed
to replace a string only in lines that match a specific pattern:
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("sed", "-i", "/^[0-9]/s/oldstring/newstring/g", "file.txt")
out, err := cmd.Output()
if err != nil {
panic(err)
}
fmt.Println(string(out))
}
This command will replace the string "oldstring
" with "newstring
" only in lines that start with a number in the file "file.txt
".
Using awk in golang
Let's looks at some more examples using awk in golang
Example-1: Performing simple awk operation
Here is a simple example which uses default field separator to print 2nd column of the input file:
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("awk", "{print $2}", "file.txt")
out, err := cmd.Output()
if err != nil {
panic(err)
}
fmt.Println(string(out))
}
Example-2: Using awk to print sum of values
Let's take our example to another level and try to perform some math operation inside golang. This command will print the sum of the values in the second column of the file "file.txt
".
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("awk", "{sum += $2} END {print sum}", "file.txt")
out, err := cmd.Output()
if err != nil {
panic(err)
}
fmt.Println(string(out))
}
Example-3: Use awk to with custom field separator
In awk
, you can use the -F
option to specify a field separator, which is used to split the input into fields. The default field separator is whitespace, but you can change it to any character or regular expression.
Here's an example of how you might use the -F
option with the awk command to change the field separator to a comma:
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("awk", "-F", ",", "{print $2}", "file.txt")
out, err := cmd.Output()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(out))
}
This command will print the second field of each line in the file "file.txt
", with the fields being separated by a comma.
Summary
We have covered multiple scenarios and examples using sed
and awk
language in golang programming language. We can perform both simple and complex operations using these tool inside the golang code.
Further Reading
Calling "sed" from exec.Command - Stack Overflow
Replace a line in text file Golang - Stack Overflow