One Liners: Edit hosts file

How Link to heading

Add mydomain.test pointing to 127.0.0.1 to your /etc/hosts file use:

grep -q '127.0.0.1 mydomain.test' /etc/hosts ||
  sudo sed -i '$ a 127.0.0.1 mydomain.test' /etc/hosts

To remove it do:

grep -q '127.0.0.1 mydomain.test' /etc/hosts &&
  sudo sed -i '/127.0.0.1 mydomain.test/d' /etc/hosts

Comment it out with:

grep -q '127.0.0.1 mydomain.test' /etc/hosts &&
  sudo sed -i 's/127.0.0.1 mydomain.test/# &/' /etc/hosts

And uncomment it by executing:

grep -q '# 127.0.0.1 mydomain.test' /etc/hosts &&
  sudo sed -i '/# 127.0.0.1 mydomain.test/s/^# //g' /etc/hosts

Add them to your Makefile for ultimate productivity:

IP     := 127.0.0.1
DOMAIN := mydomain.test

.PHONY: domain/add
domain/add:
	@grep -q '$(IP) $(DOMAIN)' /etc/hosts ||
		sudo sed -i '$ a $(IP) $(DOMAIN)' /etc/hosts

.PHONY: domain/remove
domain/add:
	@grep -q '$(IP) $(DOMAIN)' /etc/hosts &&
		sudo sed -i '/$(IP) $(DOMAIN)/d' /etc/hosts

.PHONY: domain/comment
domain/add:
	@grep -q '$(IP) $(DOMAIN)' /etc/hosts &&
		sudo sed -i 's/$(IP) $(DOMAIN)/# &/' /etc/hosts

.PHONY: domain/uncomment
domain/add:
	@grep -q '# $(IP) $(DOMAIN)' /etc/hosts &&
		sudo sed -i '/# $(IP) $(DOMAIN)/s/^# //g' /etc/hosts

So you can quickly use:

make domain/add
make domain/remove
make domain/comment
make domain/uncomment

Or in general with:

make domain/add       IP=127.0.0.1 DOMAIN=mydomain.test
make domain/remove    IP=127.0.0.1 DOMAIN=mydomain.test
make domain/comment   IP=127.0.0.1 DOMAIN=mydomain.test
make domain/uncomment IP=127.0.0.1 DOMAIN=mydomain.test

Why Link to heading

Using grep before sudo sed means you only need your sudo password if you mutate the file. Clever trick to save you time!

Domains pointing to localhost have to be .test and not something else, more about it in the official RFC: